游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7277|回复: 6

一个QQ堂的资源图片解码器

[复制链接]

22

主题

42

帖子

131

积分

注册会员

Rank: 2

积分
131
发表于 2005-5-13 11:26:00 | 显示全部楼层 |阅读模式
茫茫长夜无聊,结果下个了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

0

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2005-5-17 22:42:00 | 显示全部楼层

Re: 一个QQ堂的资源图片解码器

楼主真是高手!佩服ing,可否试着解一下类似的游戏泡泡堂的图片资源?小弟正在学习破解中!!!

6

主题

42

帖子

47

积分

注册会员

Rank: 2

积分
47
发表于 2005-5-18 13:13:00 | 显示全部楼层

Re:一个QQ堂的资源图片解码器

这个,在qqt刚出来的时候,我就写了,开始的时候还没有压缩,全部都是img文件格式,我写了一个解码器,现在公司,晚上,我发上来

22

主题

42

帖子

131

积分

注册会员

Rank: 2

积分
131
 楼主| 发表于 2005-5-18 13:19:00 | 显示全部楼层

Re:一个QQ堂的资源图片解码器

在Blog里出现写过了一次。附带了可执行文件。
http://blog.gameres.com/show.asp?BlogID=1237&column=0

6

主题

42

帖子

47

积分

注册会员

Rank: 2

积分
47
发表于 2005-5-18 23:40:00 | 显示全部楼层

Re:一个QQ堂的资源图片解码器

已发:  http://bbs.gameres.com/showthread.asp?threadid=29045

1

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2005-5-20 17:05:00 | 显示全部楼层

Re:一个QQ堂的资源图片解码器

  假的。。。。。。。。。。靠!

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-5-24 14:13:00 | 显示全部楼层

Re:一个QQ堂的资源图片解码器

我的QQ密码忘了怎么办吗
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 14:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表