使用 PIL 加载 RGBA 位图

2023-12-26

我尝试使用 PIL 将 32 位位图转换为 32 位 PNG。

from PIL import Image
im = Image.open('example.bmp')
print im.mode
# it prints 'RGB', but expected was 'RGBA'
im.save('output.png', format='PNG')

预期的图像模式是“RGBA”,但实际上我得到的是“RGB”。

我也尝试了以下代码,但它不起作用。

from PIL import Image
im = Image.open('example.bmp')
im = im.convert('RGBA')
im.save('output.png', format='PNG')

好的,这里有一些可以开始的事情。因为我不知道你的 BMP 文件具体是哪种格式,所以我只处理了我碰巧拥有的带有完整 alpha 通道的 BMP 的特定情况。我在这里处理的 BMP 类型可以通过使用 ImageMagick 将带有 alpha 的 PNG 转换为 BMP 来获得。这将创建所谓的“BITMAPV5”。根据您的描述,您没有 BitmapV5(因为 PIL 甚至无法打开它),因此我们需要进行迭代讨论来解决您的具体情况。

因此,您要么需要一个新的文件解码器,要么需要一个修补的BmpImagePlugin.py。 PIL 手册中描述了如何执行前者。对于后者,您显然需要发送补丁并希望将其纳入下一个 PIL 版本。我的重点是创建一个新的解码器:

from PIL import ImageFile, BmpImagePlugin

_i16, _i32 = BmpImagePlugin.i16, BmpImagePlugin.i32

class BmpAlphaImageFile(ImageFile.ImageFile):
    format = "BMP+Alpha"
    format_description = "BMP with full alpha channel"

    def _open(self):
        s = self.fp.read(14)
        if s[:2] != 'BM':
            raise SyntaxError("Not a BMP file")
        offset = _i32(s[10:])

        self._read_bitmap(offset)

    def _read_bitmap(self, offset):

        s = self.fp.read(4)
        s += ImageFile._safe_read(self.fp, _i32(s) - 4)

        if len(s) not in (40, 108, 124):
            # Only accept BMP v3, v4, and v5.
            raise IOError("Unsupported BMP header type (%d)" % len(s))

        bpp = _i16(s[14:])
        if bpp != 32:
            # Only accept BMP with alpha.
            raise IOError("Unsupported BMP pixel depth (%d)" % bpp)

        compression = _i32(s[16:])
        if compression == 3:
            # BI_BITFIELDS compression
            mask = (_i32(self.fp.read(4)), _i32(self.fp.read(4)),
                    _i32(self.fp.read(4)), _i32(self.fp.read(4)))
            # XXX Handle mask.
        elif compression != 0:
            # Only accept uncompressed BMP.
            raise IOError("Unsupported BMP compression (%d)" % compression)

        self.mode, rawmode = 'RGBA', 'BGRA'

        self.size = (_i32(s[4:]), _i32(s[8:]))
        direction = -1
        if s[11] == '\xff':
            # upside-down storage
            self.size = self.size[0], 2**32 - self.size[1]
            direction = 0

        self.info["compression"] = compression

        # data descriptor
        self.tile = [("raw", (0, 0) + self.size, offset,
            (rawmode, 0, direction))]

为了正确使用它,规范的方式应该执行:

from PIL import Image
Image.register_open(BmpAlphaImageFile.format, BmpAlphaImageFile)
# XXX register_save

Image.register_extension(BmpAlphaImageFile.format, ".bmp")

问题是已经有一个用于处理“.bmp”的插件,并且我没有费心去了解如何在前面添加这个新扩展名,以便在使用 BmpImagePlugin 之前使用它(我也不知道它是否是可以在 PIL 中做这样的事情)。说了这么多,我其实是直接使用了代码,如下:

from BmpAlphaImagePlugin import BmpAlphaImageFile

x = BmpAlphaImageFile('gearscolor.bmp')
print x.mode
x.save('abc1.png')

其中 gearscolor.bmp 是具有完整 Alpha 通道的示例位图,如前所述。生成的 png 与 alpha 数据一起保存。如果你检查BmpImagePlugin.py的代码,您会注意到我重用了它的大部分代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PIL 加载 RGBA 位图 的相关文章

  • InterfaceError:连接已关闭(使用 django + celery + Scrapy)

    当我在 Celery 任务中使用 Scrapy 解析函数 有时可能需要 10 分钟 时 我得到了这个信息 我用 姜戈 1 6 5 django celery 3 1 16 芹菜 3 1 16 psycopg2 2 5 5 我也使用了psyc
  • 将字符串转换为带有毫秒和时区的日期时间 - Python

    我有以下 python 片段 from datetime import datetime timestamp 05 Jan 2015 17 47 59 000 0800 datetime object datetime strptime t
  • 如何生成给定范围内的回文数列表?

    假设范围是 1 X 120 这是我尝试过的 gt gt gt def isPalindrome s check if a number is a Palindrome s str s return s s 1 gt gt gt def ge
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • NameError:名称“urllib”未定义”

    CODE import networkx as net from urllib request import urlopen def read lj friends g name fetch the friend list from Liv
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar

随机推荐

  • 端口自更新:“macPorts 来源:命令执行失败”

    我在尝试着selfupdate我的 Macports 但我收到以下消息 Error opt local bin port port selfupdate failed Error synchronizing MacPorts sources
  • Android意图街景不再工作

    我曾经从我的应用程序启动一个意图到地图来显示街景全景 自从几天以来 当我启动意图地图时 它说 此处不提供街景视图 我尝试运行一个新项目 其目的只是Google https developers google com maps documen
  • 如何获取类型的所有公共(获取和设置)字符串属性

    我正在尝试创建一个方法来遍历通用对象列表并替换它们的所有类型属性string这是null或空并更换 有什么好的方法可以做到这一点 我有这种 外壳 到目前为止 public static void ReplaceEmptyStrings
  • 停止 Django 将时间转换为 UTC

    时区让我发疯 每次我以为我已经弄清楚了 有人改变了时钟 我就会遇到十几个错误 我想我终于达到了存储正确值的地步 我的时代是timestamp with time zone在保存它们之前我不会删除时区 TIME ZONE Europe Lon
  • 我可以删除或移动文件夹 NuGetFallbackFolder 吗?

    我可以删除文件夹吗C Program Files dotnet sdk NuGetFallbackFolder 或者将其移动到其他文件夹 最好不要放在C盘 如果可以去除的话 怎么去除呢 直接删除文件夹吗 有任何副作用或损害吗 如果可以移动
  • 从未分配的内存中读取安全吗?

    从随机地址读取安全吗 我知道写作是未定义的行为 但是只阅读怎么样 嗯 在许多可视化调试器中 我可以看到任意地址的内存内容 这是怎么做到的 由于行为是不确定的 所以答案也是不确定的 或者至少是不稳定的 如果你幸运的话 随机地址是在内存范围内
  • 通过 Delphi 在网页上按下按钮 [重复]

    这个问题在这里已经有答案了 Ex1 WebBrowser OleObject Document GetElementByID ID HERE Click https stackoverflow com questions 10593494
  • 爪哇和谷歌地图

    是否可以在 Swing 或小程序中渲染谷歌地图 我知道我也可以使用美国宇航局世界风 http worldwind arc nasa gov 但对于一个简单的应用程序来说 这似乎太过分了 SwingX项目中有JXMapViewer组件 您可以
  • Web API 操作参数间歇性为空

    相关问题 Web API ApiController PUT 和 POST 方法间歇性接收空参数 https stackoverflow com questions 16091024 web api apicontroller put an
  • 如何一次处理多个 xpath(基于提要结构)或使用相同的结构创建我自己的提要

    下面的代码经过测试并且可以工作 它打印具有此结构的提要的内容
  • SwiftUI 表单对齐 macOS

    我正在尝试包含一个自定义HStackSwiftUI 中的行Form如下 var body some View Form TextField Text text constant test Toggle Toggle isOn constan
  • 将一个数组拆分为 2 个数组 C#

    编辑 我尝试过 Take Skip 方法 但出现以下错误 Cannot implicitly convert type System Collections Generic IEnumerable
  • 如何设置与爷爷的相对位置!元素?

    我有这样的布局 div class one div class two div class three some text div div div 可以根据祖父元素设置三个相对位置 one 在 CSS 中 看看这个 http jsfiddl
  • Powershell:二维数组

    以下内容按预期工作 values a b c d foreach value in values write host Value 0 value 0 write host Value 1 value 1 结果 1 Value 0 a Va
  • 用Java正则表达式递归替换?

    我可以更换ABC 10 5 with 10 5 using replaceAll ABC 1 2 但我不知道该怎么做ABC ABC 20 2 5 or ABC ABC 30 2 3 2 如果我能够转换为 20 2 5我怎样才能转换回ABC
  • 内省模块类时“#map(&proc)”习惯用法如何工作?

    介绍成语 我找到了一个有趣但无法解释的替代方案 https stackoverflow com a 3680719 1301972到一个被接受的答案 该代码显然可以在 REPL 中运行 例如 module Foo class Bar def
  • 如何在 Spring Boot 中向静态资源添加 Cache-Control 标头?

    我怎样才能添加Cache ControlSpring Boot 中静态资源的 HTTP 标头 尝试在应用程序中使用过滤器组件 它可以正确写入标头 但是Cache Control标头被覆盖 Component public class Cac
  • .NET - 使用类库存储 App.config

    网上似乎有很多人问这个问题 但到目前为止我的研究还没有得出解决方案 而且 至少目前 我还没有接受 这是不可能的 作为解决方案 简而言之 我想要做的就是在 NET 类库项目中拥有一个配置文件 该文件在任何引用该类库的应用程序中都可用 我的设置
  • 我应该为 C 中的 erand48() 使用什么种子值?

    我是 C 编程新手 我读到 erand48 是线程安全随机数生成的一个不错的选择 然而 该函数采用的种子值为 unsigned Short int array 3 关于这个种子值应该初始化为什么有什么建议吗 好吧 首先 让我澄清一下 PRN
  • 使用 PIL 加载 RGBA 位图

    我尝试使用 PIL 将 32 位位图转换为 32 位 PNG from PIL import Image im Image open example bmp print im mode it prints RGB but expected