使用python PIL更改8位.png图像的调色板
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用python PIL更改8位.png图像的调色板,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1683字,纯文字阅读大概需要3分钟。
内容图文
![使用python PIL更改8位.png图像的调色板](/upload/InfoBanner/zyjiaocheng/821/3c07ed8cdf144bf2a09de71470d4ad62.jpg)
我正在寻找一种快速的方法来将新的调色板应用于现有的8位.png图像.我怎样才能做到这一点?保存图像时,.png是否重新编码? (自己回答:看来是这样)
我尝试过(编辑过):
import Image, ImagePalette
output = StringIO.StringIO()
palette = (.....) #long palette of 768 items
im = Image.open('test_palette.png') #8 bit image
im.putpalette(palette)
im.save(output, format='PNG')
通过我的testimage,保存功能大约需要65毫安.我的想法:没有解码和编码,它可以更快?
解决方法:
如果你只想改变调色板,那么PIL就会妨碍你.幸运的是,当您只对某些数据块感兴趣时,PNG文件格式设计为易于处理. PLTE chunk的格式只是一个RGB三元组阵列,最后有一个CRC.要在不读取或写入整个文件的情况下就地更改文件上的调色板:
import struct
from zlib import crc32
import os
# PNG file format signature
pngsig = '\x89PNG\r\n\x1a\n'
def swap_palette(filename):
# open in read+write mode
with open(filename, 'r+b') as f:
f.seek(0)
# verify that we have a PNG file
if f.read(len(pngsig)) != pngsig:
raise RuntimeError('not a png file!')
while True:
chunkstr = f.read(8)
if len(chunkstr) != 8:
# end of file
break
# decode the chunk header
length, chtype = struct.unpack('>L4s', chunkstr)
# we only care about palette chunks
if chtype == 'PLTE':
curpos = f.tell()
paldata = f.read(length)
# change the 3rd palette entry to cyan
paldata = paldata[:6] + '\x00\xff\xde' + paldata[9:]
# go back and write the modified palette in-place
f.seek(curpos)
f.write(paldata)
f.write(struct.pack('>L', crc32(chtype+paldata)&0xffffffff))
else:
# skip over non-palette chunks
f.seek(length+4, os.SEEK_CUR)
if __name__ == '__main__':
import shutil
shutil.copyfile('redghost.png', 'blueghost.png')
swap_palette('blueghost.png')
此代码将redghost.png复制到blueghost.png并在原位修改blueghost.png的调色板.
– >
内容总结
以上是互联网集市为您收集整理的使用python PIL更改8位.png图像的调色板全部内容,希望文章能够帮你解决使用python PIL更改8位.png图像的调色板所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。