如何在C#中正确显示被误判为黑白的灰度TIFF图像
解决灰度TIFF在.NET图像处理库中被识别为黑白图像的问题
我有一张灰度TIFF图像,使用ImageMagick、ImageSharp、System.Drawing等库处理时,均被识别为黑白图像,但在ImageJ、Photoshop、Incarta等软件中可清晰显示为灰度图。尝试了以下代码仍未解决问题:
TiffEncoder encoder = new TiffEncoder(); encoder.PhotometricInterpretation = SixLabors.ImageSharp.Formats.Tiff.Constants.TiffPhotometricInterpretation.BlackIsZero; SixLabors.ImageSharp.Image image = SixLabors.ImageSharp.Image.Load(mysteryTiff); PixelTypeInfo pixType = image.PixelType; // Stretches the image to fit the pictureBox. Stream stream = new MemoryStream(); image.SaveAsTiff(stream, encoder); stream.Position = 0; MagickImage magickImage = new MagickImage(stream); pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox1.ClientSize = new System.Drawing.Size(1200, 1200); pictureBox1.Image = magickImage.ToBitmap();
问题原因
这类现象通常源于TIFF文件的光度解释元数据标记与实际像素数据不匹配,或是图像采用了带灰度调色板的索引色格式,但.NET类库严格遵循元数据解析,未像专业图像软件那样自动校正格式偏差。
解决方案
方案1:ImageMagick强制转灰度
直接加载后转换为8位灰度格式,跳过元数据干扰:
using (MagickImage magickImage = new MagickImage(mysteryTiff)) { magickImage.Format = MagickFormat.Gray; magickImage.Depth = 8; pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox1.ClientSize = new System.Drawing.Size(1200, 1200); pictureBox1.Image = magickImage.ToBitmap(); }
方案2:ImageSharp校正像素格式
先判断是否为索引色格式,再转换为8位灰度:
using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using (Image image = Image.Load(mysteryTiff)) { if (image.PixelType.Indexed) { using (var grayImage = image.CloneAs<Gray8>()) { using (MemoryStream stream = new MemoryStream()) { grayImage.SaveAsTiff(stream); stream.Position = 0; pictureBox1.Image = System.Drawing.Image.FromStream(stream); } } } else { TiffEncoder encoder = new TiffEncoder(); encoder.PhotometricInterpretation = SixLabors.ImageSharp.Formats.Tiff.Constants.TiffPhotometricInterpretation.BlackIsZero; using (MemoryStream stream = new MemoryStream()) { image.SaveAsTiff(stream, encoder); stream.Position = 0; pictureBox1.Image = System.Drawing.Image.FromStream(stream); } } pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox1.ClientSize = new System.Drawing.Size(1200, 1200); }
方案3:System.Drawing手动生成灰度图
通过克隆图像并替换调色板实现灰度转换:
using (System.Drawing.Image sourceImage = System.Drawing.Image.FromFile(mysteryTiff)) { System.Drawing.Bitmap grayBitmap = new System.Drawing.Bitmap(sourceImage.Width, sourceImage.Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed); // 生成灰度调色板 System.Drawing.Imaging.ColorPalette palette = grayBitmap.Palette; for (int i = 0; i < 256; i++) { palette.Entries[i] = System.Drawing.Color.FromArgb(i, i, i); } grayBitmap.Palette = palette; // 绘制原图像到灰度画布 using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(grayBitmap)) { g.DrawImage(sourceImage, new System.Drawing.Rectangle(0, 0, sourceImage.Width, sourceImage.Height)); } pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox1.ClientSize = new System.Drawing.Size(1200, 1200); pictureBox1.Image = grayBitmap; }
内容的提问来源于stack exchange,提问作者jdmneon
相关产品推荐
相关产品推荐

