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

比如我有这样的数据(不完整),怎样把用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

慕雪6442864
浏览 1427回答 3
3回答

函数式编程

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

慕码人8056858

在显示图像之前,首先要获取到图像文件的存放路径,这里采用标准的文件打开对话框来选取图像文件,文件名存放在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();}elseAfxMessageBox("从流中装载图像失败!");}   其中,显示工作主要是由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 //指向目标图元设备环境句柄的指针);

鸿蒙传说

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