作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
import cairo
from PIL import Image as im
orig_image = im.open('Camilla_Belle_photo_3.jpg') #http://i56.tinypic.com/261i5cn.jpg
surface = cairo.ImageSurface.create_from_png('Camilla_Belle_photo_3.png') #http://i52.tinypic.com/20gmypv.png
context = cairo.Context(surface)
#draw stuff
other_image = im.frombuffer('RGBA', orig_image.size, surface.get_data(), 'raw', 'RGBA', 0, 1)
other_image.save('test.png') #resulting image: http://i51.tinypic.com/farns.png
我可以使用 Surface.write_to_png 来让它工作,但我想知道是否有一种方法可以做到这一点而不必将其保存到文件中。我记得以前用过这个,但它是针对黑白图像的,这解释了为什么我以前没有问题。
最佳答案
变化的本质告诉我们图像上的蓝色和红色 channel 已经交换。在这种情况下,这意味着 cairo 在内存中以“蓝绿红 Alpha”顺序维护像素数据,而不是“红绿蓝 Alpha”。
幸运的是,Python 的 PIL 提供了对这种反转的支持:只需将“BGRA”作为模式参数传递给原始解码器(代替函数调用中的第二个“RGBA”)。
此外,您不需要使用 PIL 打开图像 - cairo 直接加载它,并且您可以从 cairo 的表面获取尺寸:
import cairo
from PIL import Image as im
surface = cairo.ImageSurface.create_from_png('Camilla_Belle_photo_3.png')
context = cairo.Context(surface)
#draw stuff
size = surface.get_width(), surface.get_height()
other_image = im.frombuffer('RGBA', size, surface.get_data(), 'raw', 'BGRA', 0, 1)
other_image.save('test.png')
关于python - 为什么开罗会弄乱我的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5640030/
我是一名优秀的程序员,十分优秀!