48位TIFF格式

时间:2010-03-06 09:19:30

标签: java c++

我有一个以tiff格式保存的图像,每像素24位。我是否知道是否有一个用C语言或java编写的程序可以将每像素24位转换为每像素48位?

4 个答案:

答案 0 :(得分:1)

如果我用C编写这样的程序,我首先要查看libtiff。读取和写入tiff图像数据非常简单。

更有趣的问题是如何将24位图像数据转换为48位。输出比输入宽,所以你必须从某个地方拿出缺少的位。您可以通过在三个通道中的每个通道中将最低的8位设置为零来天真地开始,但是某种插值可能会产生更好的结果。

可能有一些有用的提示等待从源头开采到gimp和graphicsmagick。 (事实上​​,他们可能已经在早餐前做过这种转换而没有眨眼。)

答案 1 :(得分:0)

我不太确定它是否能够处理48位tiff,但你可能想看看imagemagick

答案 2 :(得分:0)

我遇到了类似的24位RGB问题。我在将图像复制到GPU进行处理之前,每3字节手动插入一个空字节,然后在处理后删除该空字节。这个 DRAMATICALLY 提高了GPU处理的性能,所以你肯定必须这样做。

以下两个功能可以完成工作(它们已成功通过测试)。


/* .........................................................
*/
void copyInsertingPading3to4 (const unsigned char * source, 
                             unsigned char * destination,
                             unsigned int sourceSizeInBytes) 
{
  unsigned int j=0;
  for (unsigned int i=0; i<=sourceSizeInBytes-1; i++) 
    {
      destination[j] = source[i];
      if (i%3 == 2) {
        j++;
        destination[j] = 0;
      }
          j++;
    }
} // ()

/* ......................................................... */ void copyRemovingPading4to3 (const unsigned char * source, unsigned char * destination, unsigned int sourceSizeInbytes) { unsigned int j=0; for (unsigned int i=0; i<=sourceSizeInBytes-1; i++) { if ( (i%4) < 3 ) { destination[j] = source[i]; j++; } } } // ()

请注意,删除填充时,源的大小(以字节为单位)大于 原文: - )

答案 3 :(得分:-1)

从24位图像转换为48位图像非常简单。由于24位图像中的每个通道都是48位图像对应通道的MSB,因此您只需要在彼此之间填充一个零字节。

  大端的

RGB → R0G0B0和小端的RGB → 0R0G0B

uint8_t  img24[PIXELCOUNT*3];
uint16_t img48[PIXELCOUNT*3];
unsigned int i;

for (i = 0; i < PIXELCOUNT*3; i++)
    img48[i] = img24[i];

uint8_t img24[PIXELCOUNT*3], img48[PIXELCOUNT*6];
unsigned int i;

for (i = 0; i < PIXELCOUNT*3; i++)
{
    img48[i*2] = 0;
    img48[i*2 + 1] = img24[i]; // reverse for big endian
}