首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过枕头的Image.frombytes创建的图像与预期不同

通过枕头的Image.frombytes创建的图像与预期不同
EN

Stack Overflow用户
提问于 2015-05-21 12:03:33
回答 1查看 2.3K关注 0票数 1

我开始为image-processing使用枕头,我需要使用不同的像素。

最后,我想从字节中创建图像。

所以我使用PIL.Image.frombytes(mode, size, data, decoder_name='raw', *args)函数。

你能告诉我数据应该是什么吗?

我认为,对于RGB模式,它应该是字节字符串,如R1G1B1R2G2B2R3G3B3...RnGnBn。

但我有点困惑于以下几点:

代码语言:javascript
复制
from PIL import Image

def image_create_load_compare(initial_data):
    img = Image.frombytes('RGB', (4, 1), initial_data)
    img.save("temp.jpg")

    img_loaded = Image.open("temp.jpg")
    data_loaded = img_loaded.tobytes()
    print("initial_data: " + str(initial_data))
    print("data_loaded:  " + str(data_loaded))
    print("is initial and loaded data equal: " + str(initial_data == data_loaded))
    print("="*30)

# 4 black pixels
black_bytes = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
image_create_load_compare(black_bytes)

# 4 white pixels
white_bytes = b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
image_create_load_compare(white_bytes)

# 1 red pixel, 3 white pixels
red_white_bytes = b'\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff'
image_create_load_compare(red_white_bytes)

# 1 red pixel, 3 black pixels
red_black_bytes = b'\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
image_create_load_compare(red_black_bytes)

以及产出:

代码语言:javascript
复制
initial_data: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
data_loaded:  b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
is initial and loaded data equal: True
==============================
initial_data: b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
data_loaded:  b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
is initial and loaded data equal: True
==============================
initial_data: b'\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff'
data_loaded:  b'\xda\x11\x07\xff\xe2\xe3\xf4\xfd\xff\xe0\xff\xff'
is initial and loaded data equal: False
==============================
initial_data: b'\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
data_loaded:  b'\xda\x11\x07E\x00\x00\x00\x05\x16\x00\n\x1e'
is initial and loaded data equal: False
==============================

当我检查创建的文件时,有一个红色像素和三个白色/黑色像素的图像看起来像从红色到白色或黑色的渐变。为什么不同颜色的文件中的像素与预期不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-21 12:37:05

JPEG是一种有损格式。为了减少文件大小,它将改变像素的颜色,使它们更加可压缩。

尝试以无损格式保存临时文件,如png。

代码语言:javascript
复制
img.save("temp.png")

img_loaded = Image.open("temp.png")

现在,您的测试应该全部输出True

代码语言:javascript
复制
initial_data: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
data_loaded:  b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
is initial and loaded data equal: True
==============================
initial_data: b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
data_loaded:  b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
is initial and loaded data equal: True
==============================
initial_data: b'\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff'
data_loaded:  b'\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff'
is initial and loaded data equal: True
==============================
initial_data: b'\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
data_loaded:  b'\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
is initial and loaded data equal: True
==============================
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30373195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档