c++ - 图片库写错了

标签 c++ libpng libjpeg

我正在使用 libpng 和 libjpeg 来读取和写入图像。我使用的代码几乎直接取自两个库文档中提供的示例,图像加载在两个库中都能正常工作。但是,当我去保存图像时,出了点问题,似乎以某种方式写入了损坏的数据。令人困惑的部分是它使用两个库以完全相同的错误方式编写它。这是一个例子:

原文:

Original picture

模糊图片(保存前在程序中的样子):

Blurred picture

如何保存 (png):

Discolored png

jpeg 版本保存时有相同的变色,只是压缩得更多。

这是 png 保存代码:

void PNGHandler::save(PixelBuffer* buffer, std::string fileName)
{
    FILE* filePointer = fopen(fileName.c_str(), "wb");

    int width = buffer->getWidth();
    int height = buffer->getHeight();

    png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    png_infop info = png_create_info_struct(png);

    png_init_io(png, filePointer);

    // 8-bit depth, RGBA
    png_set_IHDR(png, info, width, height, 8,
        PNG_COLOR_TYPE_RGBA, PNG_INTERLACE_NONE,
        PNG_COMPRESSION_TYPE_DEFAULT,
        PNG_FILTER_TYPE_DEFAULT);

    png_write_info(png, info);


    // Set up rows for writing from
    png_bytep *rowPointers = new png_bytep[height];
    for(int y = 0; y < height; y++) {
        rowPointers[y] = new png_byte[png_get_rowbytes(png,info)];
    }

    for(int y = 0; y < height; y++) {
        for(int x = 0; x < width; x++) {
            ColorData cd = buffer->getPixel(x, height - y - 1);
            rowPointers[y][x*4] = (int)(cd.getRed() * 255);
            rowPointers[y][x*4+1] = (int)(cd.getGreen() * 255);
            rowPointers[y][x*4+2] = (int)(cd.getBlue() * 255);
            rowPointers[y][x*4+3] = (int)(cd.getAlpha() * 255);
        }
    }

    png_write_image(png, rowPointers);
    png_write_end(png, info);

    delete [] rowPointers;
    png_destroy_write_struct(&png, &info);
    fclose(filePointer);
}

(我知道错误处理现在不是很好,但我稍后会修复)

此外,文件总是以这种方式保存。也就是说,我可以应用模糊并保存,然后重新加载原始文件并再次执行此操作,并对两个文件执行 diff 显示它们是相同的。传入的 PixelBuffer 指针是指向正在屏幕上显示的缓冲区的指针,因此所有颜色数据都应该与它显示的完全一样。

我知道这没有太多信息可以继续,但如果有人可以指导我寻找我应该寻找的东西,我可以带来更多(这是一个大项目,所以我不能发布所有代码)

编辑:还值得注意的是,图像在保存后看起来是正确的,但是一旦加载保存的图像,它就会显示变色。这向我指出了保存方法中的一个问题

最佳答案

您的过滤器/模糊可能溢出/下溢颜色值。您应该确保值在 0 和 255 之间饱和(如果值低于 0,则将它们设置为 0,如果值高于 255,则将它们设置为 255)

关于c++ - 图片库写错了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36895054/

相关文章:

C++ 在类中使用类对象

c++ - libjpeg 和 libpng 中的这些属性是什么?

c++ - 对 libjpeg : jpeg_read_scanlines 感到困惑

c++ - 仅用于解包的 C/C++ Windows+Linux ZIP 库?

c++ - 从 GetSystemTimePreciseAsFileTime() 到本地时间的可靠快速方法

c++ - 在 lambda 中正确转发参数包而不丢弃限定符

c - 如何正确安装libpng?

c++ - 哪个更慢,jpeg 还是 png?

macos - 如何修复 Homebrew 权限?

android - ndk-build *** 多目标模式。停止