求助!!由二进制还原成图片
图片数据,头不懂怎么加。请问哪位大神,帮且搞搞。。
数据很清楚,
图像大小 134*169
图片数据大小 5386
二进制数据在
B0 EC 03 FF 07 EE FF 00 0F 12 0F 24 0F 36 0F 48 0F 00 5A 0F 6C 0F 7E 0F 90 0F A2 0F B4 0F C6 0F D8 0F 00 EA 0F FC 0F 0E 1F 20 1F 32 1F 44 1F 56 1F 68 1F 04 7A 1F 8C 1D 00 9E 10 8C 1F B2 1F C4 1F D6 1F 00 E8 1F FA 1F 0C 2F 1E 2F 30 2F 42 2F 54 2F 66 2F 00 78 2F 8A 2F 94 1B A8 23 96 2F C2 2F D4 2F E6 2F 00 F8 2F 0A 3F 1C 3F 2E 3F 40 3F 52 3F 64 3F 76 3F 00 88 3F 9A 3F A2 2D B0 2F CE 3F E0 3F F2 3F 04 4F 00 16 4F 28 4F 3A 4F 4C 4F 5E 4F 70 4F 82 4F 94 4F 00 A6 4F B0 3D BC 3F DA 4F EC 4F FE 4F 10 5F 22 5F 00 34 5F 46 5F 58 5F 6A 5F 7C 5F 8E 5F A0 5F B2 5F 00 BA 4F CC 4F E8 5F FA 5F 0C 6F 1E 6F 30 6F 42 6F 00 54 6F 66 6F 78 6F 8A 6F 9C 6F AE 6F C0 6F B2 3F 00 E4 6F F6 6F 08 7F 1A 7F 2C 7F 3E 7F 50 7F 62 7F 00 74 7F 86 7F 98 7F AA 7F BC 7F C8 6F DC 6F F2 7F 00 04 8F 16 8F 28 8F 3A 8F 4C 8F 5E 8F 70 8F 82 8F 00 94 8F A6 8F B8 8F CA 8F D2 7F E6 7F 00 9F 12 9F 00 24 9F 36 9F 48 9F 5A 9F 6C 9F 7E 9F 90 9F A2 9F 00 B4 9F C6 9F D8 9F D6 7B E2 9F 0A AF 1C AF 2E AF 00 40 AF 52 AF 64 AF 76 AF 88 AF 9A AF AC AF BE AF 00 D0 AF E2 AF EC 9F 06 BF 18 BF 2A BF 3C BF 4E BF 00 60 BF 72 BF 84 BF 96 BF A8 BF BA BF CC BF DE BF 00 F0 BF FA AF 14 CF 26 CF 38 CF 4A CF 5C CF 6E CF 00 80 CF 92 CF A4 CF B6 CF C8 CF DA CF EC CF FE CF 00 08 CF 22 DF 34 DF 46 DF 58 DF 6A DF 7C DF 8E DF 00 A0 DF B2 DF C4 DF D6 DF E8 DF FA DF 04 DF 16 DF 00 30 EF 42 EF 54 EF 66 EF 78 EF 8A EF 9C EF AE EF 00 C0 EF D2 EF E4 EF F6 EF 08 FF E0 8F 9C 11 18 FF 00 14 FF 54 FF 66 FF 78 FF 8A FF 9C FF AE FF C0 FF 00 D2 FF E4 FF F6 FF 08 0F 1A 0F 3C
F9 40 FD EA 8F 00 5A 0F 6C 0F 7E 0F 90 0F A2 0F B4 0F C6 0F D8 0F 00 EA 0F FC 0F 0E 1F 20 1F D6 7F 3A 0F 42 1F 68 1F 00 7A 1F 8C 1F 9E 1F B0 1F C2 1F D4 1F E6 1F F8 1F 00 0A 2F 1C 2F 2E 2F 38 1F 38 2F 4C 2F 76 2F 88 2F 00 9A 2F AC 2F BE 2F D0 2F E2 2F F4 2F 06 3F 18 3F 00 2A 3F 3C 3F 46 2F 46 3F 56 3F 84 3F 96 3F A8 3F 00 BA 3F CC 3F DE 3F F0 3F 02 4F 14 4F 26 4F 38 4F 00 40 3F 70 3D 62 4F 74 3F 90 4F A2 4F B4 4F C6 4F 00 D8 4F EA 4F FC 4F 0E 5F 20 5F 32 5F 44 5F 4E 4F 00 54 1B 82 4F 34 05 54 5F A2 5F B4 5F C6 5F D8 5F 00 EA 5F FC 5F 0E 6F 20 6F 32 6F 44 6F 56 6F 82 5D 00 66 4B 52 4F 60 6F AA 6F BC 6F CE 6F E0 6F F2 6F 00 04 7F 16 7F 28 7F 3A 7F 4C 7F 5E 7F 28 0F
7A 6F 00 76 4F 6A 7F B8 7F CA 7F DC 7F EE 7F 00 8F 12 8F 00 24 8F 36 8F 48 8F 5A 8F 6C 8F 72 6F 3A FD 6C 3D 00 A4 7F C2 8F D4 8F E6 8F F8 8F 0A 9F 1C 9F 2E 9F 00 40 9F 52 9F 64 9F 6E 7F 72 5F 82 5B 9E 8F AE 8F 00 CC 9F DE 9F F0 9F 02 AF 14 AF 26 AF 38 AF 4A AF 00 5C AF 6E AF 78 9F 88 99 9E 9B 72 4F 66 4F D0 AF 00 E2 AF F4 AF 06 BF 18 BF 2A BF 3C BF 4E BF 60 BF 00 72 BF 80 AF 97 BF 3A FF 92 BF 7E 9F DE BF F0 BF 00 02 CF 14 CF 26 CF 38 CF 4A CF 5C CF 6E CF 80 CF 00 88 BF 9A BF AC BF BE BF CE BF EC CF FE CF 10 DF 00 22 DF 34 DF 46 DF 58 DF 6A DF 7C DF 8E DF C0 CF 00 B8 AF D4 CF CE CF DC CF FA DF 0C EF 1E EF 30 EF 00 42 EF 54 EF 66 EF 78 EF 8A EF 9C EF AE EF AE CF 00
..... 图片还原显示 二进制
[解决办法]
得根据数据格式才可以显示吧。比如BMP文件,头部有图片的各种信息的,先读取到以后才可以根据这些来处理后续的数据块部分
[解决办法]
信息不完全,图像大小为134*169,而数据大小5386却与134*169没有什么倍数关系,所以极有可能是某种压缩格式,必须弄清楚图片的颜色格式,和像素数据压缩方式才能还原图片。
void CCatchScreenDlg::SaveRectBmp(CDC *pDC,LPRECT lprect,BOOL bIsInsertToDB)
{
int cx = lprect->right-lprect->left;
int cy = lprect->bottom-lprect->top;
CDC memDC;
CBitmap bmp;
memDC.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC,cx,cy);
CBitmap *bmpold = memDC.SelectObject(&bmp);
memDC.BitBlt(0,0,cx,cy,pDC,lprect->left,lprect->top,SRCCOPY);
BITMAP bInfo;
bmp.GetBitmap(&bInfo);
int szPanel = 0;
if(bInfo.bmBitsPixel<16)
szPanel = pow((double)2,(double)bInfo.bmBitsPixel) * sizeof(RGBQUAD);
BITMAPINFO *pBitInfo = (BITMAPINFO*)LocalAlloc(LPTR,sizeof(BITMAPINFO)+szPanel);
pBitInfo->bmiHeader.biBitCount = bInfo.bmBitsPixel;
pBitInfo->bmiHeader.biClrImportant = 0;
pBitInfo->bmiHeader.biCompression = BI_RGB;//0;
pBitInfo->bmiHeader.biHeight = bInfo.bmHeight;
pBitInfo->bmiHeader.biPlanes = bInfo.bmPlanes;
pBitInfo->bmiHeader.biSize = sizeof(BITMAPINFO);
pBitInfo->bmiHeader.biSizeImage = bInfo.bmWidthBytes*bInfo.bmHeight;
pBitInfo->bmiHeader.biWidth = bInfo.bmWidth;
pBitInfo->bmiHeader.biXPelsPerMeter = 0;
pBitInfo->bmiHeader.biYPelsPerMeter = 0;
BYTE *pData = new BYTE[bInfo.bmWidthBytes*bInfo.bmHeight];
GetDIBits(memDC.m_hDC,bmp,0,bInfo.bmHeight,pData,pBitInfo,DIB_RGB_COLORS);
BITMAPFILEHEADER FileHeader;
FileHeader.bfType = 0x4d42;//BM
FileHeader.bfReserved1 = 0;
FileHeader.bfReserved2 = 0;
FileHeader.bfSize = sizeof(BITMAPFILEHEADER);
FileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFO)+szPanel;
if(bIsInsertToDB)
{
CString sTitle("");
CString sContent("");
GetDlgItem(IDC_EDIT_STITLE)->GetWindowText(sTitle);
if(sTitle=="")
{
MessageBox(_T("请在文本框处输入文件标题"));
return;
}
DWORD nLen = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + bInfo.bmWidthBytes*bInfo.bmHeight;
BYTE *pTmp = new BYTE[nLen];
memcpy(pTmp,&FileHeader,sizeof(BITMAPFILEHEADER));
memcpy(pTmp+sizeof(BITMAPFILEHEADER),pBitInfo,sizeof(BITMAPINFO) );
memcpy(pTmp+sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO),pData,bInfo.bmWidthBytes*bInfo.bmHeight);
theApp.AddData(sTitle,sContent,pTmp,nLen,TRUE,cx+10,cy+35);
delete [] pTmp;
}
else
{
CFileDialog fDlg(FALSE,_T("jpg
[解决办法]
bmp"),_T(""),OFN_HIDEREADONLY
[解决办法]
OFN_OVERWRITEPROMPT,
_T("jpg图片(*.jpg)
[解决办法]
*.jpg
[解决办法]
bmp位图(*.bmp)
[解决办法]
*.bmp
[解决办法]
"),this);
if(fDlg.DoModal()==IDOK)
{
CString sExt = fDlg.GetFileExt();
sExt.MakeLower();
if (sExt==_T("bmp"))
{
CFile file;
file.Open(fDlg.GetPathName(),CFile::modeCreate
[解决办法]
CFile::modeReadWrite);
file.Write(&FileHeader,sizeof(BITMAPFILEHEADER));
file.Write(pBitInfo,sizeof(BITMAPINFO));
file.Write(pData,bInfo.bmWidthBytes*bInfo.bmHeight);
file.Close();
}
else if (sExt==_T("jpg"))
{
DWORD nLen = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + bInfo.bmWidthBytes*bInfo.bmHeight;
BYTE *pTmp = new BYTE[nLen];
memcpy(pTmp,&FileHeader,sizeof(BITMAPFILEHEADER));
memcpy(pTmp+sizeof(BITMAPFILEHEADER),pBitInfo,sizeof(BITMAPINFO) );
memcpy(pTmp+sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO),pData,bInfo.bmWidthBytes*bInfo.bmHeight);
CxImage *pImage = new CxImage(pTmp,nLen, CXIMAGE_FORMAT_BMP);
//先装载bmp文件,需要指定文件类型
if (pImage==NULL)
{
AfxMessageBox(_T("图片导入出错了"));
return ;
}
// 判断加载的bmp文件是否存在。
if (pImage->IsValid())
{
CViewJpgDlg cjd(this);
cjd.m_pImage = pImage;
cjd.DoModal();
}
delete pImage;
delete [] pTmp;
}
}
}
LocalFree(pBitInfo);
delete[] pData;
memDC.SelectObject(bmpold);
bmp.DeleteObject();
memDC.DeleteDC();
}
#pragma comment(lib,"gdi32")
#include <windows.h>
#include <stdio.h>
int main() {
const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;
PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);
pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = uWidth;
pbmi->bmiHeader.biHeight = uHeight;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 1;
pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;
pbmi->bmiColors[0].rgbBlue = 0;
pbmi->bmiColors[0].rgbGreen = 0;
pbmi->bmiColors[0].rgbRed = 0;
pbmi->bmiColors[1].rgbBlue = 255;
pbmi->bmiColors[1].rgbGreen = 255;
pbmi->bmiColors[1].rgbRed = 255;
HDC hDC = CreateCompatibleDC (0);
void * pvBits;
HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);
SelectObject (hDC, hBitmap);
HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");
// HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");
SelectObject (hDC, hFont);
BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);
char c[4];
int i, j;
for (i = 128; i < 256; i++) {
sprintf (c, "%02X", i);
TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);
}
for (j = 0; j < 256; j++) {
sprintf (c, "%02X", j);
TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);
}
for (i = 128; i < 256; i++) {
for (j = 0; j < 256; j++) {
c[0] = (char) i;
c[1] = (char) j;
TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);
}
}
for (i = 0; i < 130; i++) {
MoveToEx (hDC, 0, i * 17, NULL);
LineTo (hDC, uWidth, i * 17);
}
for (j = 0; j < 258; j++) {
MoveToEx (hDC, j * 17, 0, NULL);
LineTo (hDC, j * 17, uHeight);
}
BITMAPFILEHEADER bmfh;
bmfh.bfType = *(PWORD) "BM";
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;
bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;
HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
if (hFile != INVALID_HANDLE_VALUE) {
DWORD dwWritten;
WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);
WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);
WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);
CloseHandle (hFile);
}
DeleteObject (hFont);
DeleteObject (hBitmap);
DeleteDC (hDC);
LocalFree (pbmi);
return 0;
}
取二进制数据的文件头 比较以后得出文件的后缀 然后以*.后缀的形式保存 比如 *.jpg