В итоге я использовал FreeImageAPI DLL с оболочкой C #. Я стараюсь избегать сторонних библиотек, но не думаю, что есть другой выбор. Кажется, довольно стандартная и хорошо используемая библиотека.
В моем случае у меня есть System.Drawing.Image
объект 'image'
, который был создан динамически - который я хочу сохранить в выходной поток HttpContext в виде сжатого изображения. Обратите внимание, что Image
не имеет необходимого метода GetHbitmap()
, но Bitmap
имеет.
// convert image to a 'FreeImageAPI' image
var fiBitmap = FreeImageAPI.FreeImageBitmap.FromHbitmap((image as Bitmap).GetHbitmap());
fiBitmap.ConvertColorDepth(FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_08_BPP);
// see http://stackoverflow.com/questions/582766
MemoryStream ms = new MemoryStream();
fiBitmap.Save(ms, FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PNG, FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_BEST_COMPRESSION);
context.HttpContext.Response.OutputStream.Write(ms.ToArray(), 0, (int)ms.Length);
Мое растровое изображение размером 24 КБ теперь составляет всего 9 КБ: -)
Подсказка: Убедитесь, что в вашей корзине есть как 'FreeImageNET', так и 'FreeImage', когда вы запускаете их. В настоящее время примеры проектов C # содержат ссылку на «Library.DLL», которая, по-видимому, отсутствует в их zip-файле. Использование FreeImageNET.dll
и FreeImage.dll
работает, хотя. Вы получите досадную ошибку "файл не найден", если не понимаете, что FreeImageNet
! = FreeImage
!