亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有經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("渲染圖像失?。?quot;);
     pPic->Release();
    }
    else
    AfxMessageBox("從流中裝載圖像失?。?quot;);
    }  

     

  • 其中,顯示工作主要是由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 關注
  • 1480 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號