Tencent QQ皮肤图像文件格式Gft转png或bmp源代码
转载自CSDN,另附Delphi版代码:
/u/1121/14/E545FC21-41CF-4341-BCA6-770AE91F9211.html
工具是为制作QQ皮肤的人准备的,源代码是为vc程序员准备的。本压缩包即提供编译好的可执行程序,又提供了程序的源代码。
工具的作用是把Tencent公司QQ皮肤使用的Gft图像格式,转成Png或Bmp格式,当选择包含Gft文件的文件夹时,支持批量转换文件夹下及子文件夹下所有Gft文件。
此工具是喜欢制作QQ皮肤的美工朋友或喜欢仿QQ界面的开发人员必备工具。
此工具界面图片,除Logo外,也都是直接使用的QQ皮肤中的图片,版权归腾讯公司所有。
程序截图:
下载地址: /detail/psbeond/3821134
========================================================================
以下为Delphi代码:
1{*******************************************************************************
2
3TencentQQgft图像格式转换单元转换为BMP或PNG
4
5原作者:psbeond
6网址:/u/1121/14/E545FC21-41CF-4341-BCA6-770AE91F9211.html
7原始代码:/download/psbeond/3821134
8
9本人只是对C++代码翻译翻译为Delphi代码不做其他处理
10如需解包RDB文件,请自行百度“RDB打包解包工具”
11
12*******************************************************************************}
13
14unituGFT2Image;
15
16interface
17
18uses
19SysUtils,Classes;
20
21const
22E_GFT_FILE_OPEN=-1;
23E_NOT_GFT_FILE=-2;
24E_NO_IMAGE_DATA=-3;
25E_NOT_SUPPORT_IMAGE=-4;
26
27type
28TImageType=(IT_UNKNOWN,IT_BITMAP,IT_PNG);
29
30functionConvertGft2Image(strGftFile:string;Image:TStream;varImageType:TImageType):Integer;
31
32implementation
33
34
35functionConvertGft2Image(strGftFile:string;
36Image:TStream;varImageType:TImageType):Integer;
37const
38//Pngandbmpfileheader
39btPngHeader:array[0..7]ofByte=($89,$50,$4E,$47,$0D,$0A,$1A,$0A);
40wBmpHeader=$4D42;
41var
42fpGft:TFileStream;
43nGftFileLength:Int64;
44btImageOffset:Byte;
45wHeader:WORD;
46btHeader:array[0..7]ofByte;
47nImageLength:Integer;
48begin
49//Opengftfile
50ifnotFileExists(strGftFile)then
51begin
52Result:=E_GFT_FILE_OPEN;
53Exit;
54end;
55fpGft:=TFileStream.Create(strGftFile,fmOpenRead);
56
57//GetGftfilelength.
58nGftFileLength:=fpGft.Size;
59
60//Thebyteofaddress0x00000010ofgftfileisspecifytheoffsetofimage.
61ifnGftFileLength<17then
62begin
63Result:=E_NOT_GFT_FILE;
64Exit;
65end;
66
67//Getimageoffset
68//Seektobytethatspecifytheoffsetofimage.
69fpGft.Seek($00000010,soFromBeginning);
70fpGft.Read(btImageOffset,SizeOf(Byte));
71ifbtImageOffset+2>=nGftFileLengththen
72begin
73Result:=E_NO_IMAGE_DATA;
74Exit;
75end;
76
77//Checktheimagetype.
78ImageType:=IT_UNKNOWN;
79fpGft.Seek(btImageOffset,soFromBeginning);
80fpGft.Read(wHeader,SizeOf(WORD));
81ifwHeader=wBmpHeaderthen
82ImageType:=IT_BITMAP
83else
84begin
85ifbtImageOffset+8>=nGftFileLengththen
86begin
87Result:=E_NO_IMAGE_DATA;
88Exit;
89end;
90
91fpGft.Seek(btImageOffset,soFromBeginning);
92fpGft.Read(btHeader,SizeOf(Byte)*8);
93
94ifCompareMem(@btHeader,@btPngHeader,8)then
95begin
96ImageType:=IT_PNG;
97end;
98end;
99
100ifImageType=IT_UNKNOWNthen
101begin
102Result:=E_NOT_SUPPORT_IMAGE;
103Exit;
104end;
105
106//Convertgfttoimage
107nImageLength:=nGftFileLength-btImageOffset;
108ifnImageLength<=0then
109begin
110Result:=E_NO_IMAGE_DATA;
111Exit;
112end;
113fpGft.Seek(btImageOffset,soFromBeginning);
114Image.Position:=0;
115Image.CopyFrom(fpGft,nImageLength);
116Image.Position:=0;
117fpGft.Destroy;
118Result:=0;
119end;
120end.
另附Demo:
Gft2Image_Demo.rar