【问题标题】:Writing a tif pixel by pixel using LibTiff?使用LibTiff逐像素写入tif?
【发布时间】:2015-11-10 06:15:09
【问题描述】:

是否可以通过逐像素迭代并为每个像素设置 RGB 值来创建新的 tif?

让我解释一下我正在尝试做什么。我正在尝试打开一个现有的 tif,使用 TIFFReadRGBAImage 读取它,获取 TIFFGetR/TIFFGetG/TIFFGetB 给出的 RGB 值,从 255 中减去它们,获取这些新值并使用它们来写入每个一个一个像素。最后,我想得到原始图像和一个新的“补充”图像,就像原始图像的底片一样。

有没有办法使用 LibTiff 做到这一点?我已经查看了文档并在 Google 上进行了搜索,但我只看到了很短的 TIFFWriteScanline 示例,它提供了如此少的代码/上下文/cmets 行,以至于我无法弄清楚如何以我的方式实现它希望它工作。

我对编程还是很陌生,所以如果有人能指点我一个包含大量解释性 cmets 的完整示例或直接帮助我解决我的代码,我将不胜感激。感谢您花时间阅读本文并帮助我学习。

到目前为止我所拥有的:

// 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如果你需要的话。

【问题讨论】:

  • 我已经有一段时间没有写tiff代码了,但是您可以手动构建图像而不会遇到麻烦。请务必注意不同的格式、压缩、单独的平面等,除非您知道所有源都将采用一种格式。对于“下一步做什么”,构建一整行图像,然后使用 TIFFWriteScanline(....)。
  • @johnelemans 好的,谢谢。关于如何用我的 RGB 值建立一条线的任何指导?

标签: c++ libtiff


【解决方案1】:

我回去查看我的旧代码。事实证明我没有使用 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 个字节的单独平面。

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

【讨论】:

  • 啊。现在我的脑汁又在流了!非常感谢您为我指明了正确的方向!你帮了很多忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多