|
|
茫茫长夜无聊,结果下个了QQT的小游戏。
哎太幼稚的一个游戏。
不过里面的小人物倒是有意思。于是就把察看了图片资源。
呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩
。。。。。。
成功。
结果打开一看全是*.img的文件。没见过~~~~~
打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~
于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。
。。。
哎不说了。给点代码自己去研究。不过有点问题。
我搞不懂直接在贴到屏幕上显示正常。
写成BMP发现意思比较暗。。。
typedef struct tagQQBITMAPHEADER{ // bmih
char szName[8]; //QQF.DIMG 标志 8
DWORD bC1; //65536
DWORD bC2; //24
DWORD bA1; //
DWORD bA2; //
DWORD bA3; //
DWORD bA4; //
LONG biWidth; //宽
LONG biHeight; //高
DWORD biP;
DWORD biB;
DWORD biC;
DWORD biS;
LONG biWidth2; //宽
LONG biHeight2; //高
DWORD biClrUsed;
DWORD biClrImportant;
} QQBITMAPHEADER;
void CBmpToolDlg::ExpBmpFile(CString strFile)
{
BITMAPFILEHEADER bBmpFile;
BITMAPINFOHEADER bBmpInfo;
QQBITMAPHEADER bQQHead;
DWORD dwReadSize = 0;
WORD m_wWidth;
WORD m_wHeight;
DWORD m_dwImageLength;
DWORD m_dwTemLength;
WORD *m_pwImage;
CFile m_SaveFile;
CString str_Text;
try
{
HANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if ( hFile )
{
ZeroMemory(&bQQHead, sizeof(bQQHead));
ReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);
if(bQQHead.szName [0] != 'Q')return;
m_wWidth = (WORD)bQQHead.biWidth;
m_wHeight = (WORD)bQQHead.biHeight;
m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);
m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];
UINT nSize = m_dwImageLength;
ReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);
CloseHandle(hFile);
}
m_dwTemLength = 3 * m_wWidth * m_wHeight;
//重新构件一个BMP头然后在写入到新的文件
bBmpFile.bfType = 0x4d42;//'BM'
bBmpFile.bfSize = m_dwTemLength + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;
bBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //
//
bBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值
bBmpInfo.biWidth = m_wWidth;
bBmpInfo.biHeight = m_wHeight;
bBmpInfo.biPlanes = 1;
bBmpInfo.biBitCount = 24;
bBmpInfo.biCompression = BI_RGB;
bBmpInfo.biSizeImage = 0;
bBmpInfo.biXPelsPerMeter = 0;
bBmpInfo.biYPelsPerMeter = 0;
bBmpInfo.biClrUsed = 0;
bBmpInfo.biClrImportant = 0;
///////////////////////////////////////////////////////////////////////////
//倒转图像数据
BYTE *pOrgImage;
pOrgImage = new BYTE[m_dwTemLength];
BYTE bsBlueColor, bsGreenColor, bsRedColor;
//656
DWORD dwBMask = 31;
DWORD dwGMask = 2016;
DWORD dwRMask = 63448;
BYTE bBShift = 3;
BYTE bGShift = 5;
BYTE bRShift = 11;
// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);
/*
WORD dwBMask = 31;
WORD dwGMask = 2016;
WORD dwRMask = 63448;
BYTE bBShift = 0;
BYTE bGShift = 5;
BYTE bRShift = 11;
*/
WORD nXSize = m_wWidth;
int nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;
str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);
AfxMessageBox(str_Text);
for (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)
{
for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)
{
//分色处理
bsBlueColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift);
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
bsRedColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);
/* bsBlueColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift);
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);
bsRedColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);
*/
pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;
pOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;
pOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;
}
}
DeleteFile(strFile+".bmp");
if(!m_SaveFile.Open(strFile+".bmp",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::modeNoTruncate))
{
AfxMessageBox("建立文件发生错误!");
return ;
}
m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
m_SaveFile.SeekToEnd();
m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));
m_SaveFile.SeekToEnd();
m_SaveFile.Write (pOrgImage,m_dwTemLength);
m_SaveFile.Close();
if ( m_pwImage )
{
delete m_pwImage;
m_pwImage = NULL;
}
if ( pOrgImage )
{
delete pOrgImage;
pOrgImage = NULL;
}
}
catch(...)
{
}
}
该代码只能用于研究和学习中。请勿用于非法途径。
呵呵。
希望谁能结决图像16->24的问题请给我发一份。不胜感激
newsoil@163.com |
|