回 帖 发 新 帖 刷新版面

主题:显示颜色不正常的.bmp文件

附件里的.gso文件实质上是16色位图,不带[改]的是原图。
[改]M_TD_0303.gso是我在了解了16色位图的格式以后,手动改完的。
不但样子很怪,而且还颠倒了,如下图——
[img]http://www.app43.com/attachments/month_1101/11012712278df5d329c22749b8.png[/img]
求一个能使.gso文件正常显示的程序,最好有源码,谢谢!

回复列表 (共3个回复)

沙发

颜色不正常,可能是把颜色的位数弄错了。
16位颜色,其实有好几种。比如,RGB各占5位,用1位表示是否透明,或者R和B占5位,G占6位,等等。也有顺序问题,有些格式可能是RGB,有些则是BGR。楼主可以多试试。
小技巧:看第一个像素,正常时它应该是什么颜色,而在程序里又是什么颜色,把第一个像素的颜色弄正确,通常也就正确了。

板凳


忘了传附件了,不好意思。
能否麻烦大大写个转换程序呢,谢谢~

3 楼

[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]

我来回复

您尚未登录,请登录后再回复。点此登录或注册