Как сохранить растровое изображение .NET с помощью FreeImage.NET

Потратив 2 дня на то, чтобы понять, что метод C# Bitmap.Save содержит ошибки (для JPEG/оттенков серого/8bbp), я попробовал FreeImage, чтобы увидеть, смогу ли я сохранить его правильно, и на первый взгляд это так и выглядело, но при ближайшем рассмотрении кажется, это тоже не работает.

Вот мои тесты:

If I do

FreeImage.SaveBitmap(aImage, aSavePath, FREE_IMAGE_FORMAT.FIF_JPEG, FREE_IMAGE_SAVE_FLAGS.DEFAULT);

DPI изображения не сохраняются правильно, и если я конвертирую растровое изображение в FIBITMAP (чтобы я мог указать DPI

MemoryStream imageStream = new MemoryStream();
aImage.Save(imageStream, aImageFormat);

FIBITMAP dib = FreeImage.LoadFromStream(imageStream, FREE_IMAGE_LOAD_FLAGS.JPEG_ACCURATE, freeImageFormat);

FreeImage.SetResolutionX(dib, (uint)aImage.HorizontalResolution);
FreeImage.SetResolutionY(dib, (uint)aImage.VerticalResolution);
FreeImage.Save(FREE_IMAGE_FORMAT.FIF_JPEG, dib, aSavePath, FREE_IMAGE_SAVE_FLAGS.DEFAULT);

Любые идеи о том, как я могу сохранить растровое изображение с помощью FreeImage и сохранить DPI и bpp? Или метод FreeImage.Save тоже глючит?


person Gonçalo Cardoso    schedule 24.07.2014    source источник
comment
Если вы хотите сохранить детали, вам не следует использовать JPEG. И вы, конечно же, не хотите сжимать его дважды. Установка разрешения для растрового изображения — довольно бессмысленная вещь. Это просто справочный номер, который программа, считывающая изображение, может использовать для его отображения в исходном физическом размере. Это помогает, когда у вас есть дисплей Retina с высоким разрешением, он позволяет избежать отображения изображения в виде почтовой марки. Это абсолютно никак не влияет на качество изображения и не имеет смысла при конвертации изображений.   -  person Hans Passant    schedule 24.07.2014
comment
Отредактировал вопрос, чтобы уточнить детали, которые мне нужно сохранить   -  person Gonçalo Cardoso    schedule 24.07.2014
comment
Сохранять bpp тоже бессмысленно, JPEG поддерживает только 24bpp.   -  person Hans Passant    schedule 24.07.2014
comment
Нет, он также поддерживает 8 и 32 бита на пиксель.   -  person Gonçalo Cardoso    schedule 24.07.2014
comment
Нет, для поддержки дополнительных форматов пикселей требуется более поздний стандарт под названием JPEG-2000 (он же JP2). Он широко игнорируется, немногие программы могут его прочитать.   -  person Hans Passant    schedule 24.07.2014
comment
Поскольку Photoshop позволял мне сохранять 8 бит, я предположил, что это стандарт. Что касается вопроса, у вас есть какие-либо идеи о том, как я могу сохранить bpp и DPI? Потому что у меня есть клиент, который потребовал, чтобы они получали изображения в jpeg/8bbp/оттенках серого.   -  person Gonçalo Cardoso    schedule 24.07.2014
comment
Очевидно, вы работаете с довольно паршивой функциональной спецификацией. У меня нет разумных предположений о том, что это может означать. Конечно, вы должны спросить у клиента разъяснения.   -  person Hans Passant    schedule 24.07.2014


Ответы (2)


Некоторое программное обеспечение использует метаданные при получении разрешения, поэтому вы можете попробовать добавить EXIF ​​с полями DPI в jpeg, созданный с помощью FreeImage.

P.S. Ваша задача кажется довольно простой, я уверен, что вы можете найти еще несколько SDK для этого.

person Eugene    schedule 25.07.2014
comment
Из всех SDK, которые я тестировал (должны быть бесплатными), FreeImage был единственным, который мог сохранять в 8bpp jpeg. - person Gonçalo Cardoso; 25.07.2014
comment
Вы пробовали Magick.NET, оболочку .NET для ImageMagick? Я знаю, что IM может сохранять серый JPEG. - person Eugene; 25.07.2014
comment
Пробовал MagickImage, вроде работает, но есть БОЛЬШАЯ проблема: когда я делаю MagickImage image1 = new MagickImage(aPathToImage) загружаю свое изображение (также пытался загрузить растровое изображение), для его загрузки требуется 5 секунд... это нормально? - person Gonçalo Cardoso; 25.07.2014
comment
Только что сделал еще несколько тестов и понял, что выполнение ЛЮБОГО ПЕРВОГО вызова MagickImage всегда занимает 5 секунд. Это нормальное поведение? - person Gonçalo Cardoso; 25.07.2014
comment
Похоже, бенчмаркинг OpenCL не сохраняется на диск. Вероятно, вам лучше отключить его. Если вам нужна дополнительная помощь, создайте тему здесь: magick.codeplex.com/discussions. - person dlemstra; 28.07.2014

Я отказался от этих двух вариантов (FreeImage и Magick.NET) и выбрал GraphicsMagick.NET.

person Gonçalo Cardoso    schedule 04.08.2014