我有一堆不是RGB16的文件,但本质上有一种自定义格式。
这种格式有16位,通道按如下方式划分,我希望ImageMagick导入它们,然后将它们导出为可读的常规RGBA格式(或者,将每个通道导出到一个单独的灰度文件中)。
位0-4:红色
第5-9段:绿色
第10-12段:蓝色
第13-15段:阿尔法
所以基本上是5-5-3-3。
这里是一个压缩的示例文件,还包括了想要的输出(在PNG中)。有人知道怎么做吗?
我以一种不同的手工方式成功地做到了这一点,但我不知道如何在ImageMagick中这样做。
发布于 2022-03-28 10:12:42
首先要做的是将您善意提供的预期输出分离到其组成的RGBA通道中,并排放置它们,这样我们就可以在每个通道中看到我们的目标:
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个通道组合到输出文件中。
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注:
63488 = 0xf800
1984 = 0x07c0
56 = 0x0038

在Windows上,我不使用也不能测试,该命令如下所示:
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中做同样的事情:
#!/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()https://stackoverflow.com/questions/71631519
复制相似问题