使用LibTiff逐个像素地写入tif?

时间:2015-11-06 20:21:53

标签: c++ libtiff

是否可以通过逐像素迭代并为每个像素设置RGB值来创建新的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如果您需要它。

1 个答案:

答案 0 :(得分: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个字节的单独平面。

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