2008-09-04 24 views
0

Çok sayfalı bir renk tiff dosyasını C# C'deki CompressCCITT3 tiff'e dönüştürmeye çalışıyorum. Tüm piksellerin 1 bit olduğundan emin olmam gerektiğini anlıyorum. Bu çevrimiçi için kullanışlı bir örnek bulamadım.Bir TIF dosyasını sıkıştırmak

cevap

0

Yukarıdaki kodu gördüm ve her pikseli manuel mantıkla dönüştürüyor gibi görünüyordu.

Bu sizin için çalışır mı?

İthalat System.Drawing.Imaging

'renk tif dosyasını Yeni Bitmap Olarak

Dim bmpColorTIF olsun ("C: \ color.tif")

' lik bir alanı seçmek tif (tüm çerçeveleri çekecek)

Yeni dikdörtgen olarak

Dim rectColorTIF (0, 0, bmpColorTIF.Width, bmpColorTIF.Height)

'1 bit col olarak dikdörtgen klon veya Bitmap = bmpColorTIF.Clone olarak

Dim bmpBlackWhiteTIF (rectColorTIF, PixelFormat.Format1bppIndexed) tif

'Eğer yeni bir bitmap (kaydetmek, vs)

ne istiyorsan yap

...

Not: Aralarından seçim yapabileceğiniz bir ton piksel biçimi vardır.

1

Yasal uyarı reddi: .NET görüntüleme yazılımı yapan bir şirket olan Atalasoft için çalışıyorum. dotImage kullanma

, bu görev Böyle bir şey olur:

FileSystemImageSource source = new FileSystemImageSource("path-to-your-file.tif", true); // true = loop over all frames 
// tiff encoder will auto-select an appropriate compression - CCITT4 for 1 bit. 
TiffEncoder encoder = new TiffEncoder(); 
encoder.Append = true; 

// DynamicThresholdCommand is very good for documents. For pictures, use DitherCommand 
DynamicThresholdCommand threshold = new DynamicThresholdCommand(); 

using (FileStream outstm = new FileStream("path-to-output.tif", FileMode.Create)) { 
    while (source.HasMoreImages()) { 
     AtalaImage image = source.AcquireNext(); 
     AtalaImage finalImage = image; 
     // convert when needed. 
     if (image.PixelFormat != PixelFormat.Pixel1bppIndexed) { 
      finalImage = threshold.Apply().Image; 
     } 
     encoder.Save(outstm, finalImage, null); 
     if (finalImage != image) { 
      finalImage.Dispose(); 
     } 
     source.Release(image); 
    } 
} 

olarak gider Bob Powell örnek kadarıyla, iyidir, ama buna olmasıdır az hangi sorunları, bir numarası vardır Basit bir eşik kullanarak, hız istiyorsanız ve çıktılarınızın neye benzediğini ya da giriş alanınızın aslında gerçekten çok siyah ve beyaz renkte olduğu gibi renklendirilmediğinden emin olun. Binarizasyon zor bir sorundur. Göreviniz mevcut bilgiyi 1/24'e kadar azaltmak olduğunda, doğru bilgileri nasıl saklayacağınız ve gerisini nasıl atacağınız bir zorluktur. DotImage'ın ikili hale getirme için altı farklı aracı (IIRC) vardır. SimpleThreshold, bakış açımdan varilin alt kısmıdır.

1

Önce kodlamaya dalmadan önce tiff ve görüntü yardımcı programlarını kullanarak istenen sonuçları denemenizi öneriyorum. Kullanışlı bir araç olması için VIPS'u buldum. Bir sonraki seçenek LibTIFF'in neler yapabileceğine bakmaktır. Ben C# kullanarak ücretsiz LibTiff.NET ile iyi sonuçlar elde ettik (ayrıca bkz. stackoverflow). Eğer milajınız değişse de (16-bit-gri tonlamaya gerek duymuyorum) GDI tiff işlevselliği beni çok hayal kırıklığına uğrattı. Ayrıca, LibTiff yardımcı programlarını da kullanabilirsiniz (bkz. http://www.libtiff.org/man/tiffcp.1.html)

İlgili konular