0

我写了一个桌面应用程序,将 8 位 TIFF 转换为 1 位,但输出文件无法在 Photoshop(或其他图形软件)中打开。应用程序的作用是

  • 它迭代原始图像的每 8 个字节(每个像素 1 个字节)
  • 然后将每个值转换为布尔值(因此为 0 或 1)
  • 每 8 个像素保存一个字节 - 字节中的位与原始图像中的像素的顺序相同

我设置的 TIFF 标签:MINISBLACK,压缩为 NONE,填充顺序为 MSB2LSB,平面配置是连续的。我正在使用 BitMiracle 的 LibTiff.NET 来读取和写入文件。

流行软件无法打开输出,我做错了什么?

输入图片:http
://www.filedropper.com/input 输出图片:http ://www.filedropper.com/output

4

1 回答 1

2

从您对字节操作部分的描述来看,您似乎正在正确地将图像数据从 8 位转换为 1 位。如果是这种情况,并且您没有特定理由使用自己的代码从头开始执行此操作,则可以使用 System.Drawing.Bitmap 和 System.Drawing.Imaging.ImageCodecInfo 简化创建有效 TIFF 文件的任务。这允许您保存未压缩的 1 位 TIFF 或具有不同压缩类型的压缩文件。代码如下:

// first convert from byte[] to pointer
IntPtr pData = Marshal.AllocHGlobal(imgData.Length);
Marshal.Copy(imgData, 0, pData, imgData.Length);
int bytesPerLine = (imgWidth + 31) / 32 * 4; //stride must be a multiple of 4. Make sure the byte array already has enough padding for each scan line if needed
System.Drawing.Bitmap img = new Bitmap(imgWidth, imgHeight, bytesPerLine, PixelFormat.Format1bppIndexed, pData);

ImageCodecInfo TiffCodec = null;
foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders())
   if (codec.MimeType == "image/tiff")
   {
      TiffCodec = codec;
      break;
   }
EncoderParameters parameters = new EncoderParameters(2);
parameters.Param[0] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionLZW);
parameters.Param[1] = new EncoderParameter(Encoder.ColorDepth, (long)1);
img.Save("OnebitLzw.tif", TiffCodec, parameters);

parameters.Param[0] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
img.Save("OnebitFaxGroup4.tif", TiffCodec, parameters);

parameters.Param[0] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionNone);
img.Save("OnebitUncompressed.tif", TiffCodec, parameters);

img.Dispose();
Marshal.FreeHGlobal(pData); //important to not get memory leaks
于 2015-01-29T21:57:15.467 回答