使用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
相关产品推荐
相关产品推荐

