Почему изображения в формате JPEG создаются с помощью System.Рисунок больше, чем исходные растровые изображения?

StackOverflow https://stackoverflow.com/questions/825487

Вопрос

У меня странная проблема - у меня есть около 14,5 миллионов растровых изображений, которые предположительно несжаты.Мне нужно преобразовать эти растровые изображения в JPG и сохранить их в базе данных.

Когда я использую классы, предоставляемые в системе .NET.Библиотека рисования для сохранения растрового изображения в формате ImageFormat.Jpeg, результирующий JPEG имеет размер около дважды размер исходного растрового изображения.Вот этот код:

byte[] bitmapBytes = //get from the db
using(MemoryStream bitmapStream = new MemoryStream(bitmapBytes))
{
   using(Bitmap bitmap = (Bitmap)Bitmap.FromStream(bitmapStream))
   {
       bitmap.Save("jpg.jpg", ImageFormat.Jpeg);
   }
}

Я просмотрел шестнадцатеричное значение нескольких из этих изображений, и, похоже, что параметр сжатия равен "нет".Поэтому я предполагаю, что они несжатые.Кроме того, шестнадцатеричный код исходного файла имеет код "BMP", а результирующий файл, как и следовало ожидать, имеет код "JFIF".

Изображения черно-белые, без цветов.

Есть какие-нибудь мысли относительно того, почему это могло бы происходить?Ищу указатели в правильном направлении...

Правки:

  • Я пробовал использовать альтернативную перегрузку для сохранения, которая позволяет вам указать качество.Никакой пользы не видно.
  • Я должен также уточнить, что здесь я в какой-то степени застрял с JPEG.Это устаревшая система, и другие части системы ожидают формат JPEG.

Атрибуты изображения:

  • Размеры растрового изображения:152x48
  • Размер файла растрового изображения:1022 байта
  • JPEG:то же измерение
  • Размер JPEG:2,2 кб
  • Информация о растровом изображении:Проиндексированный, 1 слой (2 цвета)
  • Разрешение растрового изображения:96,012 x 96,012 ppi
Это было полезно?

Решение

Вероятно, это потому, что изображения в формате jpeg, которые вы сохраняете, теперь представляют собой 24-битные цветные изображения RGB, где растровые изображения представляют собой черно-белые изображения со скоростью 1 бит / с.

Если растровые изображения имеют размер 1 бит / с, jpeg, вероятно, не самый лучший формат для их преобразования.

Другие советы

Черно-белый или в оттенках серого?

От http://www.faqs.org/faqs/compression-faq/part2/section-6.html:

"JPEG работает как с полноцветными, так и с серыми изображениями;он не обрабатывает двухуровневые (черно-белые) изображения, по крайней мере, не очень хорошо.Он не обрабатывает изображения с цветным отображением также;вы должны предварительно развернуть их в несопоставленное полноцветное представление.JPEG лучше всего работает на изображениях с "непрерывным тоном".Изображения с большим количеством резких скачков значений цвета не будут хорошо сжиматься ".

Вам нужно установить атрибут для кодировщика, чтобы указать ему используемый уровень сжатия.

Смотрите также

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

Что касается того, почему ваши файлы становятся больше, возможно, ваш BMP был закодирован по длине выполнения или с использованием меньшего (не 24-битного) растрового изображения.

Сравнение размеров для двухцветного изображения 61x64:

  • Факс-4 tiff:268 байт
  • 2 цветных bmp (как указано выше):550 байт
  • 8-битный jpeg:1502 байта
  • 32-разрядный формат jpeg (как системный.Рисование бы создало):2015 байт

Итак, если вам нужно использовать файлы jpeg, сначала преобразуйте их в 8-битный формат.Делать это в .Net будет неудобно, но есть пример кода, доступный на CodeProject и других сайтах.

Просто хотел доработать свое решение.Мне удалось настроить остальную часть системы на поддержку графики в формате PNG, поэтому я преобразовал растровые изображения в графику PNG и сделал их черно-белыми по 1 биту на пиксель.Это делало их маленькими и эффективными.

Итак, проблема заключалась в том, что JPG-файлы просто плохо воспроизводят изображения с несколькими цветами.

Просто мысль:вы говорите, что части вашей системы нужны файлы в формате JPEG.Это действительно так или просто нужно, чтобы файлы имели расширение JPG?Если это так, вы могли бы - хотя это и некрасиво - просто переименовать расширение файла, поскольку BMP-файлы в вашем случае меньше.

Например, в Windows вы можете взять BMP-файл и изменить его расширение на JPG, когда вы открываете его, Windows не заботится об этом и отображает его должным образом.

Эта статья kb должна показать вам, как это сделать

http://support.microsoft.com/kb/324790

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top