从单通道12位Little Endian原始二进制数据转换

詹尼·霍伊(Zennehoy)

我有一个原始的二进制图像文件,其中每个像素都包含12位数据(灰度)。例如,原始文件中的前四个像素:

0x0  0xC0
0x1  0x05
0x2  0x5C
0x3  0xC0
0x4  0x05
0x5  0x5C

这对应于值为0x5C0(小字节序)的4个像素值。

不幸的是,使用以下命令:

convert -size 384x184 -depth 12 gray:frame_0.raw out.tiff

错误地解释了像素值(大端),从而导致像素值0xC00 0x55C 0xC00 0x55C

我尝试了选项-endian LSB-endian MSB,但不幸的是,它们仅更改输出字节顺序,而不更改输入字节顺序。

如何获得转换以将原始图像打开为12位小字节序数据?

马克·谢切尔

我对此进行了快速尝试,但没有测试数据,但它应该非常接近并且很容易检测到图像中的错误:

// pad12to16.c
// Mark Setchell
// Pad 12-bit data to 16-bit
//
// Compile with:
// gcc pad12to16.c -o pad12to16
//
// Run with:
// ./pad12to16 < 12-bit.dat > 16-bit.dat

#include <stdio.h>
#include <sys/uio.h>
#include <unistd.h>
#include <sys/types.h>

#define BYTESPERREAD    6
#define PIXPERWRITE     4

int main(){
    unsigned char  buf[BYTESPERREAD];
    unsigned short pixel[PIXPERWRITE];

    // Read 6 bytes at a time and decode to 4 off 16-bit pixels
    while(read(0,buf,BYTESPERREAD)==BYTESPERREAD){
       pixel[0] = buf[0] | ((buf[1] & 0xf) << 8);
       pixel[1] = (buf[2] << 4) | ((buf[1] & 0xf0) >> 4);
       pixel[2] = buf[3] | ((buf[2] & 0xf) << 8);
       pixel[3] = (buf[5] << 4) | ((buf[4] & 0xf0) >> 4);
       write(1,pixel,PIXPERWRITE*2);
    }
    return 0;
}

因此,您可以运行以下命令(我认为):

./pad12to16 < 12-bit.dat | convert -size 384x184 -depth 16 gray:- result.tif 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否有一个oneliner可以将二进制文件从Little Endian转换为Big Endian?

将原始的14位二进制补码转换为带符号的16位整数

将8字节的Little-Endian二进制文件转换为双精度浮点数

如何将8位二进制数据转换为十六进制

如何将二值文本数据转换为二进制(位表示)

以MYSQL二进制数据类型存储128位二进制数

从二进制转换为64位浮点

转换为二进制截断位

将整数转换为4位二进制

如何对Python中的原始二进制数据使用按位运算符进行CRC检查?

C ++-在Little Endian中将双精度序列化为二进制文件

Dart 或 Flutter 如何读取由 float32 little endian 编码的二进制文件并将其转换为 List<double>?

javascript:不使用按位运算就将二进制字符串转换为UInt32 big-endian

将整数的numpy数组转换为12位二进制

将 char 转换为二进制位,即: 'a' 到二进制等价物

Python:读取12位二进制文件

如何从文件中转储原始二进制“位”,而没有行号和ASCII解释?

在javascript中转换二进制原始图像数据

将二进制位集转换为十六进制(C ++)

在Python中将32位二进制数字转换为十进制

从十进制转换为最多n位的二进制数字

如何将十进制值转换为二进制位?

十进制包括负到 32 位二进制转换器

将十进制数7710转换为8位二进制补码

从十六进制到二进制的转换,在Java中保持8位

使用按位运算符将十进制转换为二进制

十进制数转换为16位二进制(C)

Java从十进制转换为8位二进制

Python 3.6 将 8 位二进制转换为十进制