为了账号安全,请及时绑定邮箱和手机立即绑定

有经jpeg编码过的图片十六进制代码,如何将图片显示出来?

有经jpeg编码过的图片十六进制代码,如何将图片显示出来?

慕雪6442864 2019-02-03 09:05:29
比如我有这样的数据(不完整),怎样把用vb显示出来76 00 32 00 00 FF D8 FF FE 00 24 12 01 59 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 08 00 F0 01 40 03 01 21 00 02 11 01 03 11 0A 16 17 18 19 1A 25 26 27 28 29 2A 34 35 36 37 38 39 3A 43 44 45 46 47 48 49 4A 53 54 55 56 57 58 59 5A 63 64 65 66 67 68 69 6A 73 74 75 76 77 78 79 7A 83 84 85 86 87 88 89 8A 92 93 94 95 96 97 98 99 9A A2 A3 A4 A5 A6 A7 A8 A9 AA B2 B3 B4 B5 B6 B7 B8 B9 BA C2 C3 C4 C5 C6 C7 C8 C9 CA D2 D3 D4 D5 D6 D7 D8 D9 DA E1 E2 E3 E4 E5 E6 E7 E8 E9 EA F1 F2 F3 F4 F5 F6 F7 F8 F9 FA 11 00 02 01 02 04 04 03 04 07 05 04 04 00 01 02 77 00 01 02 03 11 04 05 21 31 06 12 41 51 07 61 71 13 22 32 FF 00 3F 30 FF 00 DF 6B FE 34 EC F6 0F 67 53 B3 1A 6F 2D 47 06 E6 1F FB F8 BF E3 51 9B CB 5C 64 5D 43 FF 00 7D 8F F1 A2 CC 9F 65 53 F9 58 C3 7D 6B FF 00 3F 30 FF 00 DF C1 FE 34 C3 7D 6C 48 02 E2 22 4F 60 E3 26 84 9F 41 FB 2A 9D 99 FF FF D9 76 00 32 00 00
查看完整描述

3 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

使用JEPG的算法程序即可显示从文件中读取到的JPEG十六进制数据。
但是更简单的方法是使用空间的LoadPicture方法将图形文件加载到控件上。
前者速度比较快,专业的图形软件都使用这种办法。后者方便简单,但是效率较低。

查看完整回答
反对 回复 2019-03-14
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

  • 在显示图像之前,首先要获取到图像文件的存放路径,这里采用标准的文件打开对话框来选取图像文件,文件名存放在CString 型的变量m_sPath中:

    CFileDialog dlg(TRUE,"jpg","*.jpg",
    OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
    "JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif||",NULL);
    if(dlg.DoModal()==IDOK)
    {
    m_sPath=dlg.GetPathName();
    Invalidate();
    }

  •  为简单计,图形显示的代码直接在视类中的OnDraw中编写,首先打开文件并判断文件的可用性,并把文件内容放到流接口IStream的对象pStm中:

    IStream *pStm;
    CFileStatus fstatus;
    CFile file;
    LONG cb;
    ……
    if (file.Open(m_Path,CFile::modeRead)&&file.GetStatus(m_Path,fstatus)&& ((cb = fstatus.m_size) != -1))
    {
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
    LPVOID pvData = NULL;
    if (hGlobal != NULL)
    {
     if ((pvData = GlobalLock(hGlobal)) != NULL)
     {
      file.ReadHuge(pvData, cb);
      GlobalUnlock(hGlobal);
      CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
     }
    }
    }

  •  然后,就直接调用OleLoadPicture函数从流中装载图像:
    IPicture *pPic;
    ……
    OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic));

     

  • 由于该函数有时会导致失败,所以应当用SUCCEEDED宏来做一些适当的保护工作,只有在数据装载成功的前提下才能继续下面的图像显示工作:

    if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
    {
    OLE_XSIZE_HIMETRIC hmWidth;
    OLE_YSIZE_HIMETRIC hmHeight;
    pPic->get_Width(&hmWidth);
    pPic->get_Height(&hmHeight);
    double fX,fY;
    ……
    fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
    fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
    if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL))) {
     AfxMessageBox("渲染图像失败!");
     pPic->Release();
    }
    else
    AfxMessageBox("从流中装载图像失败!");
    }  

     

  • 其中,显示工作主要是由IPicture接口对象的Render函数来完成的,该函数主要用来将图片的指定部分画到指定的设备环境的指定位置。原型如下:

    HRESULT Render( HDC hdc, //渲染图像用的设备环境句柄
    long x, //在hdc上的水平坐标
    long y, //在hdc上的垂直坐标
    long cx, //图像宽度
    long cy, //图像高度
    OLE_XPOS_HIMETRIC xSrc, //在源图像上的水平偏移
    OLE_YPOS_HIMETRIC ySrc, //在源图像上的垂直偏移
    OLE_XSIZE_HIMETRIC cxSrc,//在源图像上水平拷贝的数量
    OLE_YSIZE_HIMETRIC cySrc,//在源图像上垂直拷贝的数量
    LPCRECT prcWBounds //指向目标图元设备环境句柄的指针);



查看完整回答
反对 回复 2019-03-14
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

支持一楼的说法,最好不要把图片放在数据库中。其实可以先把这段数据写到一个变量中,然后存进去就是了,读出来的时候也是直接读到那个缓冲区里,然后强制转换成Image类型,直接赋给PictureBox就行了,可参照如下代码,把读出来的二进制数据转换成数据数据。
public Image ByteArrayToImage(byte[] byteArrayIn, int count)
{
MemoryStream ms = new MemoryStream(byteArrayIn, 0, count);
Image ReturnImage = Image.FromStream(ms);
return ReturnImage;
}



查看完整回答
反对 回复 2019-03-14
  • 3 回答
  • 0 关注
  • 1426 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信