2014-11-14 178 views
0

我編寫了一個桌面應用程序,它將8位TIFF轉換爲1bit,但輸出文件無法在Photoshop(或其他圖形軟件)中打開。 什麼應用程序是否是將TIFF轉換爲1bit

  • 它遍歷每8個字節的原始圖像的(每像素1個字節)
  • 然後將每個值轉換爲bool(所以無論是0或1)
  • 每8個像素保存在一個字節 - 在字節位以相同的順序與原始圖像

的TIFF標籤我設置在像素:MINISBLACK,壓縮是NONE,填充順序是MSB2LSB,平面配置是連續的。我使用BitMiracle的LibTiff.NET來讀取和寫入文件。

我在做什麼錯誤,輸出不能被流行的軟件打開?

輸入圖像:http://www.filedropper.com/input
輸出圖像:http://www.filedropper.com/output
我的轉換代碼:http://paste.ofcode.org/jqQ4zQp5SYaJwR2rUybBa

+1

首先,您可以嘗試查看例如當你在那裏做相同的步驟時,Photoshop會生成。 – Joey 2014-11-14 13:12:39

+0

規格:https://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf – 2014-11-14 13:14:43

+0

您可能指定了錯誤的BITSPERSAMPLE和/或SAMPLESPERPIXEL值。嘗試使用AsTiffTagViewer實用程序打開您的圖像並查看它將顯示的內容。 – Bobrovsky 2014-11-14 19:02:08

回答

0

從你的字節操作部的說明中,它出現您正在從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 
+0

我現在正在開發一個不同的項目,但當我回到這裏時,我一定會嘗試您的解決方案 – Val 2015-02-09 09:37:50