2014-01-27 14 views
1

Я пытаюсь понять и реализовать фрагмент кода для сжатия Tiff.C# Методы сжатия файлов Tiff

Я уже использовал 2 отдельных метода - использование LibTiff.NEt сторонних разработчиков DLL (1-й метод громоздкий) и метод сохранения изображений http://msdn.microsoft.com/en-us/library/ytz20d80%28v=vs.110%29.aspx (второй метод работает только на компьютере с Windows 7, но не на Windows 2003 или 2008 сервере) ,

Теперь я ищу, чтобы изучить этот третий метод.

using System.Windows.Forms; 
using System.Windows.Media.Imaging; 
using System.Drawing.Imaging; 

     int width = 800; 
     int height = 1000; 
     int stride = width/8; 
     byte[] pixels = new byte[height*stride]; 

     // Try creating a new image with a custom palette. 
     List<System.Windows.Media.Color> colors = new List<System.Windows.Media.Color>(); 
     colors.Add(System.Windows.Media.Colors.Red); 
     colors.Add(System.Windows.Media.Colors.Blue); 
     colors.Add(System.Windows.Media.Colors.Green); 
     BitmapPalette myPalette = new BitmapPalette(colors); 

     // Creates a new empty image with the pre-defined palette 

     BitmapSource image = BitmapSource.Create(
      width, 
      height, 
      96, 
      96, 
      System.Windows.Media.PixelFormats.BlackWhite, 
      myPalette, 
      pixels, 
      stride); 


FileStream stream = new FileStream(Original_File, FileMode.Create); 
TiffBitmapEncoder encoder = new TiffBitmapEncoder(); 
encoder.Compression = TiffCompressOption.Ccitt4; 
encoder.Frames.Add(BitmapFrame.Create(image)); 
encoder.Save(stream); 

Но у меня нет полного понимания того, что здесь происходит.

Существует, очевидно, какой-то поток памяти, к которому применяется техника сжатия. Но я немного смущен, как применить это к моему конкретному делу. У меня есть оригинальный файл tiff, я хочу использовать этот метод, чтобы установить его сжатие в CCITT и сохранить его обратно. Может ли кто-нибудь помочь?

Я скопировал вышеуказанный код и код запускается. Но мой конечный выходной файл является сплошным черным фоном. Хотя с положительной стороны он имеет правильный тип сжатия.

http://msdn.microsoft.com/en-us/library/ms616002%28v=vs.110%29.aspx

http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.tiffcompressoption%28v=vs.100%29.aspx

http://social.msdn.microsoft.com/Forums/vstudio/en-US/1585c562-f7a9-4cfd-9674-6855ffaa8653/parameter-is-not-valid-for-compressionccitt4-on-windows-server-2003-and-2008?forum=netfxbcl

+0

Почему вы добавили тег asp.net? Вы делаете это проект asp.net? – mbeckish

+0

есть. У меня есть веб-страница, которая позволяет пользователю вводить данные, которые затем преобразуются в файл tiff. Первоначальный тип сжатия tiff-файла - LZW. Мне нужно это в формате сжатия CCITT. – Philo

+0

Возможно, у вас проблемы, потому что [пространство имен чертежа не поддерживается в службах ASP.NET] (http://stackoverflow.com/q/390532/21727) – mbeckish

ответ

0

LibTiff.net немного громоздким, так как она основана от LibTIFF, который имеет свой собственный набор проблем.

Наша компания (Atalasoft) имеет возможность сделать это довольно легко, и free version of the SDK выполнит задание, которое вы хотите, с несколькими ограничениями. Код для повторного кодирования файл будет выглядеть следующим образом:

public bool ReencodeFile(string path) 
{ 
    AtalaImage image = new AtalaImage(path); 
    if (image.PixelFormat == PixelFormat.Pixel1bppIndexed) 
    { 
     TiffEncoder encoder = new TiffEncoder(); 
     encoder.Compression = TiffCompression.Group4FaxEncoding; 
     image.Save(path, encoder, null); // destroys the original - use carefully 
     return true; 
    } 
    return false; 
} 

Вещи вы должны знать:

  • этот код будет работать только на 1bpp изображениях
  • этот код будет НЕ работа должным образом на многостраничных TIFFs
  • этот код делает НЕ сохранить метаданные в исходном файле

, и я хотел бы, чтобы код, по крайней мере, проверял на это. Если вы склонны иметь решение, что лучше сохраняет то, что в содержании файла, вы хотели бы сделать это:

public bool ReencodeFile(string origPath, string outputPath) 
{ 
    if (origPath == outputPath) throw new ArgumentException("outputPath needs to be different from input path."); 
    TiffDocument doc = new TiffDocuemnt(origPath); 

    bool needsReencoding = false; 
    for (int i=0; i < doc.Pages; i++) { 
     if (doc.Pages[i].PixelFormat == PixelFormat.Pixel1bppIndexed) { 
      doc.Pages[i] = new TiffPage(new AtalaImage(origPath, i, null), TiffCompression.Group4FaxEncoding); 
      needsReencoding = true; 
     } 
    } 
    if (needsReendcoding) 
     doc.Save(outputPath); 
    return needsReencoding; 
} 

Это решение будет соблюдать все страницы в документе, а также метаданные документа.

+0

спасибо. Я все еще пытаюсь использовать приведенную выше методологию для решения моего дела. Если вы можете помочь с этим. Пожалуйста, дайте мне знать. – Philo

+0

Также, если изображение не изначально 1bpp? – Philo

+0

Вы не можете кодировать ничего, кроме 1bpp в CCITT. Для других битовых глубин вам нужно выбрать другой кодек (обычно flate или jpeg). Я бы посоветовал вам потратить немного времени на сжатие изображений и кодеки. Кроме того, если вы посмотрите на спецификацию TIFF и подумаете: «Я могу полностью написать этот формат самостоятельно» - подумайте еще раз, это тонкий и неряшливый (необычная комбинация). – plinth

Смежные вопросы