为什么使用System.Drawing创建的JPEG图像比原始位图大?

Sam*_*tte 3 .net system.drawing image-manipulation image-processing

我有一个奇怪的问题 - 我有大约1450万个位图图像,据说是未压缩的.我需要将这些位图转换为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);
   }
}
Run Code Online (Sandbox Code Playgroud)

我已经查看了其中几个图像的HEX,看起来压缩设置是"无".所以我假设他们没有压缩.此外,原始文件的HEX具有"BMP"代码,结果文件具有您期望的"JFIF"代码.

图像是黑白的,没有颜色.

有关为什么会发生这种情况的任何想法?寻找正确方向的指针......

编辑:

  • 我已经尝试使用备用过载保存,允许您指定质量.看不到任何好处.
  • 我还应该指出,我在某种程度上坚持使用JPEG.这是一个遗留系统,系统的其他部分需要JPEG.

图像属性:

  • 位图尺寸:152x48
  • 位图文件大小:1022个字节
  • JPEG:相同的尺寸
  • JPEG大小:2.2 kb
  • 位图信息:索引,1层(2种颜色)
  • 位图分辨率:96.012x 96.012 ppi

Moo*_*ose 6

这可能是因为您保存的jpeg图像现在是24位RGB彩色图像,其中位图是1 bpp黑白图像.

如果位图是1 bpp,jpeg可能不是转换它们的最佳格式.


Jee*_*Bee 5

黑白还是灰度?

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

"JPEG适用于全彩色或灰度图像;它不能处理双层(黑白)图像,至少不能很好.它也不处理彩色图像;你必须将它们预先扩展为未映射的图像全彩色表示.JPEG在"连续色调"图像上表现最佳.颜色值突然跳跃的图像不能很好地压缩."