.Net Image.Save меняет tiff с CTTIT Fax 4 на LZW - PullRequest
6 голосов
/ 23 декабря 2010

Когда я поворачиваю изображение, .Net переключает кодировку TIFF.Есть ли способ сохранить CCITT Fax 4 (кодировка факса группы 4) и не переключать его на LZW?Вот как я вращаю изображение на диске.

System.Drawing.Image img = System.Drawing.Image.FromFile(input);
//rotate the picture by 90 degrees
img.RotateFlip(RotateFlipType.Rotate90FlipNone);
img.Save(input, System.Drawing.Imaging.ImageFormat.Tiff);

Спасибо, Брайан

Обновление: вот код, основанный на статьях, ссылки на которые приведены ниже.Я хотел добавить код здесь для полноты.Кроме того, я установил горизонтальное разрешение, поскольку для растровых изображений по умолчанию установлено значение 96 DPI.

//create an object that we can use to examine an image file
System.Drawing.Image img = System.Drawing.Image.FromFile(input);

//rotate the picture by 90 degrees
img.RotateFlip(RotateFlipType.Rotate90FlipNone);

// load into a bitmap to save with proper compression
Bitmap myBitmap = new Bitmap(img);
myBitmap.SetResolution(img.HorizontalResolution, img.VerticalResolution);

// get the tiff codec info
ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/tiff");

// Create an Encoder object based on the GUID for the Compression parameter category
System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Compression;

// create encode parameters
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, (long)EncoderValue.CompressionCCITT4);
myEncoderParameters.Param[0] = myEncoderParameter;

// save as a tiff
myBitmap.Save(input, myImageCodecInfo, myEncoderParameters);

// get encoder info for specified mime type
private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
   int j;
   ImageCodecInfo[] encoders;
   encoders = ImageCodecInfo.GetImageEncoders();
   for (j = 0; j < encoders.Length; ++j)
   {
       if (encoders[j].MimeType == mimeType)
           return encoders[j];
   }
   return null;
}

1 Ответ

6 голосов
/ 23 декабря 2010

Класс Image не даст вам необходимых гранулярных элементов управления.

Чтобы сделать это, вам нужно прочитать в растровое изображение, создать кодировщик TIFF, установить параметр для типа сжатия, а затем заставить растровое изображение сохранить изображение с использованием этого кодека и параметра.

Вот пример, который должен привести вас в правильном направлении:

http://msdn.microsoft.com/en-us/library/system.drawing.imaging.encoder.compression.aspx

В данный момент на моем Mac нет открытой VS.

Вот более подробная информация:

http://social.msdn.microsoft.com/Forums/en/windowswic/thread/e05f4bc2-1f5c-4a10-bd73-86a676dec554

...