枕头模块 - 裁剪和保存时色调变化(无转换)

Pillow module - hue change when cropping and saving (no conversion)

我想裁剪图像并保存,但问题是图像在保存相同格式后色调变化很大。为什么会这样?我什至没有在这个过程中转换它。

这是我的代码:

def square_crop(resized_image):
    print "square crop"
    width, height = resized_image.size
    print width,height
    edge_length = 3600

    if(width >= height):
        print("width>=height")
        left = (width - edge_length)/2
        top = (height - edge_length)/2
        right = (width + edge_length)/2
        bottom = (height + edge_length)/2
        squared_image = resized_image.crop((left, top, right, bottom))
        squared_image.save('squared.png')

而且令人困惑的是,这段代码使用了相同的图像并在没有改变色调的情况下保存它,所以裁剪功能肯定有问题:

def image_resize(image):
    print "image resize"
    width, height = image.size
    print width,height

    if(width > 3601 and height > 3601):
        print width, height
        if(width >= height):
            ratio = float(width)/float(height)
            w = 3601 * ratio
            h = 3601.0
            print ratio, w, h
            resized_image = image.resize([int(w), int(h)])
            resized_image.save("resized.png")
        else:
            ratio = float(height)/float(width)
            print(ratio)
            w = 3601.0
            h = 3601 * ratio
            print ratio, w, h
            resized_image = image.resize([int(w), int(h)])
            resized_image.save("heic1509a_resized.png")

*编辑:当我导入 .jpg 文件并保存为 .jpg 时,这两个函数都有相同的色调问题。与 .tif 相同。

**编辑:我还注意到,对于某些图像,这种红色损失不会发生。我真的不知道发生了什么。我会留下前后截图自己看。

Before - After

***编辑:问题出在颜色 space 上,因为保存时颜色发生变化的图像是使用 ProPhoto RGB 颜色编码的 space(ROMM RGB(参考输出介质指标) ).

我正在使用 gimp2 将它们首先转换为 RGB 而不会丢失颜色,但我想找到一种从 python.

自动执行此操作的方法

我会 post 关于此问题的任何新更新。

问题是当我保存文件时,PIL 库自动将图像(ROMM-RGB)的颜色 space 切换为其他颜色 space(RGB 或 sRGB)并且基本上每种颜色都变了。

您只需保留图像的颜色 space 即可。如果你想转换成另一种颜色 space 你应该查找 OpenCV library.

我无法详细解释太多,因为我只是想打破僵局。这是解决此问题的代码:

resized_image.save('resized.jpg',     #file name
                    format = 'JPEG',  #format of the file
                    quality = 100,    #compression quality
                    icc_profile = resized_image.info.get('icc_profile',''))  #preserve the icc profile of the photo(this was the one that caused problems)

这里有一个 link 更深入的答案: