【问题标题】:Writing Bitmap to string insted of FILE* or XImage to PNG将位图写入字符串而不是 FILE* 或将图像写入 PNG
【发布时间】:2011-05-26 15:58:14
【问题描述】:

我将代码的输出 XImage 转换为 Bitmap,但输出文件很大,所以我考虑使用 lzrw 对其进行压缩 我使用此代码将位图写入文件

fwrite(&bmpFileHeader, sizeof(bmpFileHeader), 1, fp);
fwrite(&bmpInfoHeader, sizeof(bmpInfoHeader), 1, fp);
fwrite(pImage->data, 4*pImage->width*pImage->height, 1, fp);

无论如何我可以将它写入 (char *) 的 (FILE *),以便我可以对其使用 lzrw 压缩吗? 甚至更好,一些直接将 XImage 转换为 PNG 的方法......

谢谢;

【问题讨论】:

    标签: c linux bitmap png


    【解决方案1】:

    使用memcpy 而不是fwrite

    char* tmp = buf;
    memcpy(tmp, &bmpFileHeader, sizeof(bmpFileHeader));
    tmp += sizeof(bmpFileHeader);
    memcpy(tmp, &bmpInfoHeader, sizeof(bmpInfoHeader));
    tmp += sizeof(bmpInfoHeader);
    memcpy(tmp, pImage->data, 4*pImage->width*pImage->height);
    

    编辑:我更新代码,感谢@bdk 指出

    【讨论】:

    • 没有工作:S,如果我试图将 tmp 保存到文件中它不起作用!
    • 你应该保存的不是tmp,而是buf
    • 不是我的错,我应该在添加它之后从 tmp 中减去整个大小,如果你知道我的意思......现在可以工作了,谢谢:D
    【解决方案2】:

    对于内存中的副本,如 DReJ 所说,使用 memcpy,但如果你想将图像保存为 PNG,你可能会比寻找一个像 LodePNG 这样简单的 PNG 库做得更糟:

    http://members.gamedev.net/lode/projects/LodePNG/

    如果有一个简单的替代方案,我不会浪费时间自己重新做压缩方面的工作 - 你可以解决更重要的问题。


    编辑 - 值得一提的是,我使用 LodePNG 保存 PNG 的代码如下所示:

    void PNGSaver::save_image24(const std::string& filename, const Image24_CPtr& image)
    {
        std::vector<unsigned char> buffer;
        encode_png(image, buffer);
        LodePNG::saveFile(buffer, filename);
    }
    
    void PNGSaver::encode_png(const Image24_CPtr& image, std::vector<unsigned char>& buffer)
    {
        int width = image->width();
        int height = image->height();
        const int pixelCount = width*height;
    
        // Construct the image data array.
        std::vector<unsigned char> data(pixelCount*4);
        unsigned char *p = &data[0];
        for(int y=0; y<height; ++y)
            for(int x=0; x<width; ++x)
            {
                Pixel24 pixel = (*image)(x,y);
                *p      = pixel.r();
                *(p+1)  = pixel.g();
                *(p+2)  = pixel.b();
                *(p+3)  = 255;
                p += 4;
            }
    
        // Encode the PNG.
        LodePNG::encode(buffer, &data[0], width, height);
    }
    

    【讨论】:

    • 看起来很棒,但我不知道如何使用这个库保存 XImage,我检查了示例,没有人会显示如何做我需要的:(...
    • @killercode:相关示例是 C++ 示例中的示例 3,顺便说一句。
    • 图像数据?那是一个 XImage 结构?,这是将 XImage 转换为 PNG 的方法吗?还是位图转PNG?
    • 伙计,这太多了,会减慢一切...几乎没用,你不知道如何将 XImage 转换为 PNG?
    • @killercode:你在这里的基本目标是什么?您最初的问题没有提到速度是一个问题。如果您正在尝试保存程序中正在发生的事情的视频,我可以看到可能存在速度问题,或者您的图像真的很大。但是对于正常尺寸的图像,这一切都非常快 - 所以请为我们确定您的实际问题是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多