使用python将灰度图像保存为4位png

2023-11-30

我正在寻找一种使用 python 将灰度图像保存为 4 位 png 的快速方法。我必须保存的图像很大,因此保存它们需要相当长的时间。

假设我的图像存储在 numpy 数组中(dtype=8 位)。使用 PyPng 我可以这样做:

import png
data = map(lambda x: map(int, x/17), data)
png.from_array(data, 'L;4').save(filename)

这将保存正确的 4 位 png。有了 Pillow,我可以做到:

import PIL.Image as Image
im = Image.fromarray(data)
im.save(filename)

第二种方法(Pillow)的速度大约是第一种方法的 10 倍(即使没有对话),但图像是 8 位 png。我尝试添加行

im = im.point(lambda i: i/17) # convert values
im.mode = 'L;4'

但后来我得到*** SystemError: unknown raw mode,即使模式'L;4'被指定为https://github.com/python-pillow/Pillow/blob/master/PIL/PngImagePlugin.py

有谁知道如何用 Pillow 保存 4 位 png 或者有其他快速方法吗?


Pillow 不支持 4 位灰度。但是,如果像我一样,您只想转换8-bit图像到4-bit字节串,你可以。 仅除以 17 是不够的,因为每个像素仍将输出为 1 个字节。您需要将每个后续半字节与其相邻半字节配对以获得完整字节。

为此,你可以使用这样的东西:

def convert_8bit_to_4bit(bytestring):
    fourbit = []
    for i in range(0,len(bytestring),2):
        first_nibble = int(bytestring[i] / 17)
        second_nibble = int(bytestring[i+1] / 17)
        fourbit += [ first_nibble << 4 | second_nibble ]
    fourbit = bytes(fourbit)
    return fourbit

取决于您的其他应用程序如何处理您可能需要切换的半字节顺序'first_nibble' and 'second_nibble'与彼此

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

使用python将灰度图像保存为4位png 的相关文章

随机推荐

  • 如何每次迭代增加一个字母 N 次并存储在数组中?

    letter array for i A i ZZ i letter i print r letter 从上面的脚本我做了一个循环A B C D ZZ 现在 我想把它变成A C E G I ZZ 2步骤而不是1 我需要指导才能做到这一点 这
  • 在 Firebase 中加入两个节点

    我正在开发一个应用程序 它应该显示来自两个节点 Firebase 的数据 Firebase DB 的结构如下 College 4F2EAB65 id 4F2EAB65 name SomeCollege A3C2ED31 id A3C2ED3
  • pandas:将DataFrame最后一行除以第一行

    这个问题类似于Python Pandas 按第一行划分 DataFrame 我有一个数据框 如下所示 1125400 5430095 1095751 2013 04 02 98 91 NaN 5626 79 2013 04 03 99 29
  • 从 Java 执行 EXE 并从 EXE 获取输入和输出

    我有一个EXE file addOne exe它不断地从控制台上的用户输入一个整数 不是命令行参数 并输出整数 1到控制台上 示例输出如下所示 1 2 6 7 29 30 我正在尝试编写一个java程序 它可以 Run the EXE 不断
  • Swift 2 错误处理问题

    我正在使用 REST 获取 JSON 数据 然后解析它 为此 我使用 NSJSONObjectWithData 据我所知 该方法过去在其参数内有一个错误处理程序 但它不再存在 在我的代码中 let err NSError let optio
  • 自定义 Spring Security 应用程序中的无限循环

    我们尝试用现有的 Spring Security Basic Login 替换开源应用程序中的 REST API 以实现使用令牌的自定义登录 我读过这篇关于该主题的博文 http javattitude com 2014 06 07 spr
  • 将 HTML 实体转换为正确的字符 R

    有谁知道 r 中可以转换的通用函数 228 为其 unicode 字符 我见过一些函数 并将其转换为普通字符 任何帮助 将不胜感激 谢谢 编辑 下面是一条数据记录 我可能有超过100万条记录 除了将数据读入大量向量并针对每个元素更改记录之外
  • 由元组索引的 Python `dict`:获取饼图的一部分

    假设我有 my dict airport London Heathrow airport Tokyo Narita hipsters London Soho 什么是一种有效的 无需扫描所有键 而又优雅的方式来让所有机场脱离这本字典 即预期输
  • 避免 Android 中 EditText 的解析错误

    对于 stackoverflow 社区 我创建了这个方法来将一些 EditText 字段转换为双精度 我添加 if 语句专门是为了避免解析错误 因为我知道我的几个 EditText 字段将留空 然而 它们仍然在运行时不断出现 有人知道避免解
  • Scala 不可变变量和打印

    目前正在学习一个使用 Scala 的课程 我以前从未使用过它 因此语法和本身都是新的 我正在研究一个简单的除法函数 但遇到了一些错误 首先 我使用 var sub m 对吗 在我的代码中 我只是想做 m m n 但你无法更改变量 而且我不确
  • 使用 SAXParser 从 XML 检索 HTML 编码文本

    这是我第一次使用 SAXParser 我在 Android 中使用它 但我认为这对这个特定问题没有影响 并且我正在尝试从 RSS 提要中读取数据 到目前为止 它在很大程度上对我来说工作得很好 但是当它到达包含 HTML 编码文本的标签时 例
  • 如何在django中存储用户数组?

    我有一个 django 模型 它基本上是一个名为Contexts 它包含一些字段 例如name description和一个用户 下面是定义的模型 class Contexts models Model context name model
  • 如何比较三个预训练模型的余弦相似度?

    我有两个语料库 一个包含所有女性领导人的演讲 另一个包含男性领导人的演讲 我想测试这样一个假设 一个语料库中两个单词之间的余弦相似度与另一个语料库中相同两个单词之间的余弦相似度显着不同 这样的 t 检验 或等效的 合乎逻辑并且可能吗 此外
  • 在 Azure Function 中运行 .exe 可执行文件

    我有可执行文件 abcd exe 它包含 与许多 dll 合并 是否可以为 abcd exe 创建 Azure Function 并在 Azure Cloud Functions 中运行它 abcd exe 应用程序 System Diag
  • 使用 SQLite 开发 AIR 应用程序的最佳实践

    我将开始做几个 Adob e AIR 项目 这些项目将使用SQLite提供的功能AIR 由于这是我第一次尝试这样做 我希望得到一些指导 技巧和开发最佳实践 由于此应用程序将访问本地数据库 因此我想我可以在应用程序启动时打开与数据库的连接 并
  • 如何将数组添加到ArrayList中?

    我有一个 int 3 3 数组 它只包含 0 或 1 个值 如果值为1 我想将ArrayList中该值的坐标添加为int 2 数组 但我不知道为什么它总是添加最后一个1值坐标 有什么问题 public static void main St
  • Laravel 5.1 Eloquent isFillable() 单元测试中的差异

    在单元测试中使用时 Eloquent 会忽略模型的可填充设置吗 在非测试情况下 我得到以下输出 这是正确的 因为模型只允许某些可填充字段 m new Model dd m gt isFillable nonexistent field gt
  • 为什么在访问 Ruby on Rails 应用程序中的用户页面时不断收到路由错误?

    我正在尝试向以下位置的微帖子添加评论https github com railstutorial sample app 2nd ed来自迈克尔 哈特尔 Railstutorial 看来如果用户没有发微博 就没有问题 我可以访问他们的页面 但
  • 使用 mongoose、gridfs-stream 和 multer 上传文件时出现 MongoError

    我正在使用 Express 4 运行multer gridfs 流 and mongoose使用 mongodb 我正在尝试上传文件并将其流式传输到 gridfs 执行此操作的快速路线定义为 app post uploadfile func
  • 使用python将灰度图像保存为4位png

    我正在寻找一种使用 python 将灰度图像保存为 4 位 png 的快速方法 我必须保存的图像很大 因此保存它们需要相当长的时间 假设我的图像存储在 numpy 数组中 dtype 8 位 使用 PyPng 我可以这样做 import p