首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ImageMagick中指定自定义信道分布?

如何在ImageMagick中指定自定义信道分布?
EN

Stack Overflow用户
提问于 2022-03-26 20:17:00
回答 1查看 100关注 0票数 0

我有一堆不是RGB16的文件,但本质上有一种自定义格式。

这种格式有16位,通道按如下方式划分,我希望ImageMagick导入它们,然后将它们导出为可读的常规RGBA格式(或者,将每个通道导出到一个单独的灰度文件中)。

位0-4:红色

第5-9段:绿色

第10-12段:蓝色

第13-15段:阿尔法

所以基本上是5-5-3-3。

这里是一个压缩的示例文件,还包括了想要的输出(在PNG中)。有人知道怎么做吗?

我以一种不同的手工方式成功地做到了这一点,但我不知道如何在ImageMagick中这样做。

EN

回答 1

Stack Overflow用户

发布于 2022-03-28 10:12:42

首先要做的是将您善意提供的预期输出分离到其组成的RGBA通道中,并排放置它们,这样我们就可以在每个通道中看到我们的目标:

代码语言:javascript
复制
magick out.png -separate +smush 10 channels.png

下一步是检查文件大小。你说是512x512像素的16位数据。这意味着我期望512x512x2,即524,288字节,但是您的文件有524,290字节。快速检查显示,开始时有一个2字节的BOM表,我们需要跳过它。这意味着我们的命令必须将数据处理为16位灰度数据的512x512像素,要跳过一个2字节的头。我们也不想读文件4次,所以我们把它放入MPR "Magick持久性寄存器“(或者”命名内存块“是我对它的看法),每次我们解码通道时都会从它中回忆原始数据。

因此,在下面的命令中,第一行读取输入图像,跳过BOM并将其放入MPR中。第二行从MPR中获取一个副本,并将红色通道从其中绕出。第二,第三和第四行做同样的绿色,蓝色和阿尔法通道。最后一行将处理堆栈中的4个通道组合到输出文件中。

代码语言:javascript
复制
magick -size 512x512+2 -endian MSB -depth 16 gray:in.file -write MPR:orig +delete \
   \( MPR:orig -evaluate and 63488 \) \
   \( MPR:orig -evaluate and 1984  -evaluate leftshift 5  \) \
   \( MPR:orig -evaluate and 56    -evaluate leftshift 10 \) \
   \( MPR:orig -evaluate and 7     -evaluate leftshift 13 \) \
   -combine result.png

注:

代码语言:javascript
复制
63488 = 0xf800
1984  = 0x07c0
56    = 0x0038

在Windows上,我不使用也不能测试,该命令如下所示:

代码语言:javascript
复制
magick -size 512x512+2 -endian MSB -depth 16 gray:in.file -write MPR:orig +delete ^
   ( MPR:orig -evaluate and 63488 ) ^
   ( MPR:orig -evaluate and 1984  -evaluate leftshift 5  ) ^
   ( MPR:orig -evaluate and 56    -evaluate leftshift 10 ) ^
   ( MPR:orig -evaluate and 7     -evaluate leftshift 13 ) ^
   -combine result.png

只是为了好玩,您可以在Python中做同样的事情:

代码语言:javascript
复制
#!/usr/bin/env python3

import numpy as np
from PIL import Image

h, w = 512, 512

# Read raw 16-bit file, skipping BOM with offset=2. Reshape.
raw = np.fromfile('in.file', dtype=np.dtype('>u2'), offset=2).reshape((h,w))

# RGBA5533 packed into uint16
R = (np.bitwise_and(raw, 0xf800) >> 8).astype(np.uint8)
G = (np.bitwise_and(raw, 0x07c0) >> 3).astype(np.uint8)
B = (np.bitwise_and(raw, 0x0038) << 2).astype(np.uint8)
A = (np.bitwise_and(raw, 0x0007) << 5).astype(np.uint8)

# Stack the individual channels into RGBA
RGBA = np.dstack((R,G,B,A))

# Display or save
Image.fromarray(RGBA).show()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71631519

复制
相关文章

相似问题

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