Как сохранить изображение с исходной кодировкой
Я сталкиваюсь с неожиданным поведением, когда loading and saving images
в .net
используя только методы встроенного System.Drawing
Пространство имен.
Как я это делаю:
У меня есть изображение, которое я загружаю по телефону System.Drawing.Image.FromStream()
,
После некоторых операций мне нужно сохранить изображение с Tagged Image File Format (TIFF)
- Я достигаю этого с помощью встроенного в .net
вот так:
private void doSomethingAndSave(System.Drawing.Image image, string destFile)
{
//...doin something...
//..save the image as Tiff
image.Save(destFile, ImageFormat.Tiff);
}
Это работает как ожидалось - если я исследую файл, прочитав first 4Bytes
я получил:
0x49 0x49 0x2a 0x20
Который успешно идентифицирует TIFF-Image
, Все идет нормально...
Проблема, с которой я сталкиваюсь:
Позже в моем коде я должен перезагрузить эти изображения и, возможно, некоторые из другого источника, где я не могу ожидать, что они закодированы как TIFF
, но я могу убедиться, что они всегда создаются через .net System.Drawing.Image.Save()
,
Поэтому никакие сторонние программы / кодировки не используются.
Возможно, мне придется выполнить некоторые операции и сохранить образ обратно на диск.
На данный момент я хочу сохранить изображение в their same origin format
,
Например, я выполняю следующую операцию:
public void RotateImage(string file)
{
using(var img = System.Drawing.Image.FromFile(file))
{
img.RotateFlip(System.Drawing.RotateFlipType.Rotate270FlipNone);
img.Save(file);
}
}
Но теперь, если я исследую файл, я вижу, что формат был преобразован в PNG, первые 8 байт теперь:
0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A
Итак Tiff
-Изображение "преобразовано" в PNG
файл. Я не могу предоставить изображение формата ImageFormat.Tiff
параметр по умолчанию, потому что, возможно, исходный файл is not a TIFF
закодированный один - я должен сохранить исходный формат!
Я попытался применить исходный ImageFormat вручную: (который также заканчивается в файле PNG)
public void RotateImage(string file)
{
using(var img = System.Drawing.Image.FromFile(file))
{
var imageFormat = img.RawFormat;
img.RotateFlip(System.Drawing.RotateFlipType.Rotate270FlipNone);
img.Save(file, imageFormat);
}
}
Может потому что RawFormat
не существует в ImageCodecInfo.GetImageDecoders()
... Я пришел к этому, потому что:
Другой подход состоял в том, чтобы оценить кодировку и применить к сохранению:
public void PerfomOperation(string fileName)
{
using (var img = System.Drawing.Image.FromFile(fileName))
{
Imaging.EncoderValue format = imaging.EncoderValue.CompressionLZW;
var codecInfo = this.GetImageCodecInfo(img);
Imaging.Encoder enc = Imaging.Encoder.Compression;
Imaging.EncoderParameters ep = new Imaging.EncoderParameters(1);
ep.Param[0] = new Imaging.EncoderParameter(enc, (long)format);
img.Save(fileName, codecInfo, ep);
}
}
public ImageCodecInfo GetImageCodecInfo(System.Drawing.Image image)
{
var imgguid = image.RawFormat.Guid;
foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageDecoders())
{
if (codec.FormatID == imgguid)
return codec;
}
return null; // "image/unknown";
}
Но Guid
{b96b3caa-0728-11d3-9d7b-0000f81ef32e}
в моем Image.RawFormat
не существует в ImageCodecInfo
- хотя я использовал по умолчанию .net
метод Save(image, ImageFormat.Tiff);
до!
Поэтому я подумал, что на моей машине должен быть правильный кодек...?
Итак, напоследок:Как сохранить изображение с форматом исходного изображения
(Система предоставляет только форматы.net)