2015-11-06 104 views
1

是否可以通过逐个像素地迭代并设置每个像素的RGB值来创建一个新的tif?使用LibTiff逐像素写入tif?

让我解释我正在尝试做什么。我试图打开一个现有的tif,使用TIFFReadRGBAImage读取它,采用TIFFGetR/TIFFGetG/TIFFGetB给出的RGB值,从255中减去它们,取这些新值并用它们逐个写入每个像素。最后,我想结束原始图像和一个新的“补充”图像,这将成为原始图像的负面影像。

有没有办法使用LibTiff来做到这一点?我已经浏览了文档并搜索了Google,但是我只看到很短的代码示例TIFFWriteScanline,它们提供了很少的代码/上下文/注释,我无法弄清楚如何以我想要的方式实现它它工作。

我对编程还是比较陌生的,所以如果有人可以请我指出一个有大量解释性评论的完整例子,或者直接用我的代码帮助我,我将非常感激。感谢您花时间阅读本文并帮助我学习。

我有什么至今:

// Other unrelated code here... 

    //Invert color values and write to new image file 
    for (e = height - 1; e != -1; e--) 
    { 
     for (c = 0; c < width; c++) 
     { 
      red = TIFFGetR(raster[c]); 
      newRed = 255 - red; 
      green = TIFFGetG(raster[c]); 
      newGreen = 255 - green; 
      blue = TIFFGetB(raster[c]); 
      newBlue = 255 - blue; 
      // What to do next? Is this feasible? 
     } 
    } 

// Other unrelated code here... 

Full code如果你需要它。

+0

自从我写了tiff代码以来已经有一段时间了,但您可以毫无困难地手动构建图像。除非你知道所有的资料来源都是一种格式,否则一定要注意不同的格式,压缩,单独的平面等。对于'接下来做什么',建立一个完整的图像行,然后使用TIFFWriteScanline(....)。 –

+1

@johnelemans好的,谢谢。关于如何使用RGB值创建线条的任何指导? – Aizenmyouou

回答

2

我回去看看我的旧代码。事实证明,我没有使用libtiff。尽管如此,你正走在正确的轨道上。你想要的东西像;

lineBuffer = (char *)malloc(width * 3) // 3 bytes per pixel 
    for all lines 
    { 
     ptr = lineBuffer 
     // modify your line code above so that you make a new line 
     for all pixels in line 
     { 
      *ptr++ = newRed; 
      *ptr++ = newGreen; 
      *ptr++ = newBlue 
     } 
     // write the line using libtiff scanline write 
     write a line here 
    } 

请记住设置适当的标签。这个例子假设3个字节的像素。 TIFF还允许在每个平面上的每个像素1个字节的独立平面。

或者,您也可以将整个图像写入新缓冲区,而不是一次写入一行。

+0

啊。现在我的脑汁再次流动!非常感谢你指点我正确的方向!你帮了很多忙。 – Aizenmyouou