512x512 bmp图像如何拥有1MB的大小

0 vb.net bmp system.drawing.imaging

我保存bmp格式的代码:

ImgResult.Save(dlgSavePicture.FileName, System.Drawing.Imaging.ImageFormat.Bmp)

我已经尝试了代码,输出是一个512x512 bmp图像,大小为1兆字节

如果我使用ms paint创建一个515x512 bmp图像,大小为768kb

我试图打开图像并重新保存为bmp,大小仍为1MB

512x512的512x512 bmp图像大小可达1mb吗?或者我的代码有问题?

Han*_*ant 5

BMP是一种非常简单的图像文件格式.只是一个描述图像的小标题(大小,像素格式,分辨率,颜色表),然后是一连串的像素数据.从技术上讲,它可以用RLE进行压缩,但编码器不再烦恼了.像素数据取决于像素格式,古代的像素数据是1bpp,4bpp和8bpp,它们需要一个颜色表.16bpp可能发生,异常,正常的是24bpp(RGB)和32bpp(ARGB).换句话说,每像素3或4个字节.

所以是的,512 x 512 x 4~ = 1兆字节.MSPaint非常清楚它使用的像素格式.这是一个非常简单的绘画程序,不支持alpha混合效果.因此使用24bpp(无alpha),512 x 512 x 3~ = 786千字节.您可以使用Paint.NET创建32bpp BMP.

您在自己的程序中获得哪一个取决于您创建Bitmap对象的方式.简单版本使用与视频适配器相同的像素格式.在所有32bpp的现代机器上.16bpp可以发生,这是非常不寻常的.如果你想要另一种格式,那么你必须使用带有PixelFormat参数的Bitmap构造函数.

除此之外还有一个很好的理由,默认的像素格式通常不是最优的.最佳的10倍是与视频适配器的像素格式完全匹配的格式.选择在32bppArgb和32bppPArgb之间.P表示"预乘",alpha值预先应用于RGB值.如果你自己使用Graphics.FromImage()大量绘制位图,Argb是最有效的.PArgb对绘画最有效,像素数据可以直接与视频帧缓冲区相连,而无需转换.快了十倍.您通常关心绘画速度,这是程序中最明显的工件.

如果您关心图像文件大小,那么没有比PNG更好的选择.它通过LZW压缩压缩像素数据,典型压缩率为50%或更高.JPEG也是一个不错的选择,更高的压缩率,但它是有损的.它通过丢弃图像细节来实现高利率.适用于没有文字或艺术线条的一般图像,不需要多次压缩的照片.