3 回答

TA貢獻1807條經驗 獲得超9個贊
使用JEPG的算法程序即可顯示從文件中讀取到的JPEG十六進制數據。
但是更簡單的方法是使用空間的LoadPicture方法將圖形文件加載到控件上。
前者速度比較快,專業的圖形軟件都使用這種辦法。后者方便簡單,但是效率較低。

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 //指向目標圖元設備環境句柄的指針);

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;
}
添加回答
舉報