Почему изображения JPEG создаются с помощью System.Drawing больше, чем оригинальные растровые изображения? - PullRequest
3 голосов
/ 05 мая 2009

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

Когда я использую классы, предоставленные в библиотеке .NET System.Drawing, чтобы сохранить растровое изображение как 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);
   }
}

Я просмотрел HEX нескольких из этих изображений, и похоже, что настройка сжатия - "none". Так что я предполагаю, что они несжатые. Кроме того, HEX для исходного файла имеет код «BMP», а полученный файл имеет код «JFIF», как и следовало ожидать.

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

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

редактирует:

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

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

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

Ответы [ 9 ]

6 голосов
/ 05 мая 2009

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

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

5 голосов
/ 05 мая 2009

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

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

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

4 голосов
/ 05 мая 2009

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

Смотри также

2 голосов
/ 05 мая 2009

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

  • Факс-4: 268 байт
  • 2 bmp цвета (как указано выше): 550 байтов
  • 8 бит JPEG: 1502 байта
  • 32-битный JPEG (как System.Drawing будет создать): 2015 байт

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

2 голосов
/ 05 мая 2009

Вы захотите перейти на использование этой перегрузки Bitmap.Save , чтобы вы могли указать EncoderParameter .

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

1 голос
/ 08 мая 2009

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

Таким образом, проблема заключалась в том, что JPG не очень хорошо справляются с малоцветными изображениями.

0 голосов
/ 05 мая 2009

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

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

0 голосов
/ 05 мая 2009

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

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

0 голосов
/ 05 мая 2009
...