You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用LibTiff.net修改并写入TIFF图像RGB值的相关问题咨询

基于Libtiff.net实现TIFF图像颜色映射及像素写入方案

核心实现逻辑

  • 读取原TIFF图像的全部像素数据,存储为字节数组
  • 实现自定义颜色映射规则:将原像素的灰度值/指定通道值映射为目标伪彩色RGB值
  • 新建输出TIFF文件,配置与原图像匹配的尺寸、位深、压缩方式等参数
  • 逐行处理像素后,将生成的扫描线数据写入输出TIFF的对应位置

可运行代码示例

using BitMiracle.LibTiff.Classic;
using System.Drawing;

// 自定义颜色映射方法,可根据需求替换为你的转换规则
// 示例为灰度值到彩虹色的映射逻辑
private Color GetMappedColor(byte originalValue)
{
    int r = 0, g = 0, b = 0;
    if (originalValue < 64)
    {
        r = 0;
        g = originalValue * 4;
        b = 255;
    }
    else if (originalValue < 128)
    {
        r = 0;
        g = 255;
        b = (127 - originalValue) * 4;
    }
    else if (originalValue < 192)
    {
        r = (originalValue - 128) * 4;
        g = 255;
        b = 0;
    }
    else
    {
        r = 255;
        g = (255 - originalValue) * 4;
        b = 0;
    }
    return Color.FromArgb(r, g, b);
}

public void TiffColorMapConvert(string inputTiffPath, string outputTiffPath)
{
    // 打开原TIFF文件
    using (Tiff inputTiff = Tiff.Open(inputTiffPath, "r"))
    {
        if (inputTiff == null)
            throw new FileNotFoundException("无法读取输入TIFF文件");

        // 读取原图像基础参数
        int imageWidth = inputTiff.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();
        int imageHeight = inputTiff.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
        int samplesPerPixel = inputTiff.GetField(TiffTag.SAMPLESPERPIXEL)[0].ToInt();

        // 创建输出TIFF文件
        using (Tiff outputTiff = Tiff.Open(outputTiffPath, "w"))
        {
            // 配置输出TIFF参数,可根据需求调整
            outputTiff.SetField(TiffTag.IMAGEWIDTH, imageWidth);
            outputTiff.SetField(TiffTag.IMAGELENGTH, imageHeight);
            outputTiff.SetField(TiffTag.BITSPERSAMPLE, 8);
            outputTiff.SetField(TiffTag.SAMPLESPERPIXEL, 3);
            outputTiff.SetField(TiffTag.PHOTOMETRIC, Photometric.RGB);
            outputTiff.SetField(TiffTag.COMPRESSION, Compression.LZW);
            outputTiff.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);
            outputTiff.SetField(TiffTag.ROWSPERSTRIP, outputTiff.DefaultStripSize(0));

            int inputScanlineSize = inputTiff.ScanlineSize();
            byte[] inputScanlineBuffer = new byte[inputScanlineSize];
            byte[] outputScanlineBuffer = new byte[imageWidth * 3];

            // 逐行处理并写入像素
            for (int row = 0; row < imageHeight; row++)
            {
                // 读取原图像当前行像素
                inputTiff.ReadScanline(inputScanlineBuffer, row);

                for (int col = 0; col < imageWidth; col++)
                {
                    // 提取原像素值,单通道灰度图直接取对应位置值,多通道可自行调整取值逻辑
                    byte originalPixel = inputScanlineBuffer[col * samplesPerPixel];
                    Color mappedColor = GetMappedColor(originalPixel);

                    // 写入映射后的RGB值到输出行缓冲区
                    outputScanlineBuffer[col * 3] = mappedColor.R;
                    outputScanlineBuffer[col * 3 + 1] = mappedColor.G;
                    outputScanlineBuffer[col * 3 + 2] = mappedColor.B;
                }

                // 核心步骤:将处理后的当前行写入输出TIFF
                outputTiff.WriteScanline(outputScanlineBuffer, row);
            }
        }
    }
}

注意事项

  • 若原图像为多通道RGBA格式,只需调整原像素取值的索引即可,写入逻辑无需修改
  • 颜色映射规则可完全自定义,只需修改GetMappedColor方法的实现即可匹配你需要的效果
  • 输出TIFF的压缩格式、位深、是否包含透明通道等参数,可通过修改SetField的配置项调整

内容的提问来源于stack exchange,提问作者Sergey Bulavskiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:36:00