主题:显示颜色不正常的.bmp文件
kaninchen
[专家分:0] 发布于 2011-02-01 02:42:00
附件里的.gso文件实质上是16色位图,不带[改]的是原图。
[改]M_TD_0303.gso是我在了解了16色位图的格式以后,手动改完的。
不但样子很怪,而且还颠倒了,如下图——
[img]http://www.app43.com/attachments/month_1101/11012712278df5d329c22749b8.png[/img]
求一个能使.gso文件正常显示的程序,最好有源码,谢谢!
最后更新于:2011-02-02 22:20:00
回复列表 (共3个回复)
沙发
eastcowboy [专家分:25370] 发布于 2011-02-01 20:04:00
颜色不正常,可能是把颜色的位数弄错了。
16位颜色,其实有好几种。比如,RGB各占5位,用1位表示是否透明,或者R和B占5位,G占6位,等等。也有顺序问题,有些格式可能是RGB,有些则是BGR。楼主可以多试试。
小技巧:看第一个像素,正常时它应该是什么颜色,而在程序里又是什么颜色,把第一个像素的颜色弄正确,通常也就正确了。
板凳
kaninchen [专家分:0] 发布于 2011-02-02 22:22:00
忘了传附件了,不好意思。
能否麻烦大大写个转换程序呢,谢谢~
3 楼
hastings [专家分:30] 发布于 2011-02-16 19:00:00
[code=c]
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <string>
#include <iostream>
#include "FileManage.h"
int main()
{
int64 size;
BYTE * p;
FileManage mng, out;//FileManage是我自己封装的支持操作大于4G文件的类,你可以用FILE或fstream之类的操作。
std::string str;
BITMAPFILEHEADER bmfh = {0};
BITMAPV4HEADER bmih = {0};
mng.Open("M_TD_0303.gso");//打开文件
size = mng.Size();//获取文件大小,没打开时,此处会返回-1
if(-1 == size)
{
std::cout<<"M_TD_0303.gso 不存在!\n";
return -1;
}
out.Create("M_TD_0303.bmp",0);//创建文件,创建初始大小为0字节
str.resize(size,'\0');
p = (BYTE *)(str.c_str());
mng.Read(p,size);//全部读入
bmfh.bfType = 0x4D42;
bmfh.bfSize = 402546;
bmfh.bfOffBits = 122;
//
bmih.bV4Size = 108;
bmih.bV4Width = 374;
bmih.bV4Height = -538;
bmih.bV4Planes = 1;
bmih.bV4BitCount = 16;
bmih.bV4V4Compression = BI_BITFIELDS;
bmih.bV4RedMask = 0x0F00;
bmih.bV4GreenMask = 0xF0;
bmih.bV4BlueMask = 0x0F;
bmih.bV4AlphaMask = 0xF000;
bmih.bV4CSType = 1;
bmih.bV4Endpoints.ciexyzRed.ciexyzZ = 1;
bmih.bV4Endpoints.ciexyzGreen.ciexyzZ =1;
bmih.bV4Endpoints.ciexyzBlue.ciexyzZ =1;
out.Write(&bmfh,14);//依次写入
out.Write(&bmih,108);
out.Write(p+104,402424);
return 0;
}
[/code]
注意:这段代码魔数很多,只能针对你这张图片才有用!(主要是因为.gso图片格式不清楚)
另,生成的图片是BITMAPV4HEADER格式的位图,ACDSee和QQ影像查看器都不支持,请用其他看图软件查看,比如windows自带画图板。
样图如下(请用火狐浏览器查看本页面):另存为,后缀改成rar解压缩。
[img]http://hi.csdn.net/attachment/201102/17/219329_1297907825MZ6J.jpg[/img]
我来回复