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

时间:2018-06-06 06:57:06

标签: python python-2.7 pillow

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

这是我的代码:

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

***编辑:问题来自色彩空间,因为使用ProPhoto RGB色彩空间(ROMM RGB(参考输出中等公制))对保存时更改颜色的图像进行编码。

我正在使用gimp2将它们首先转换为RGB而不会丢失颜色,但我想找到一种方法从python自动执行此操作。

我将在此问题上发布任何新的更新。

1 个答案:

答案 0 :(得分:1)

问题在于,当我保存文件时,PIL库会自动将图像的颜色空间(ROMM-RGB)切换到其他颜色空间(RGB或sRGB),基本上每种颜色都会更改。

您所要做的就是保留图像的色彩空间,这样你就可以了。如果要转换为其他颜色空间,请查找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