我保存bmp格式的代码:
ImgResult.Save(dlgSavePicture.FileName, System.Drawing.Imaging.ImageFormat.Bmp)
我已尝试过代码,输出为512x512 bmp图像,大小为1兆字节
如果我使用ms paint创建一个515x512 bmp图像,大小为768kb
我试图打开图像并重新保存为bmp,大小仍为1MB
512x512的512x512 bmp图像大小可达1mb吗?或者我的代码有问题?
答案 0 :(得分: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 constructor。
否则这是一个很好的理由,默认的像素格式通常不是最优的。最佳的10倍是与视频适配器的像素格式完全匹配的格式。选择在32bppArgb和32bppPArgb之间。 P表示"预乘",alpha值预先应用于RGB值。如果你自己使用Graphics.FromImage()大量绘制位图,Argb是最有效的。 PArgb对绘画最有效,像素数据可以直接与视频帧缓冲区相连,而无需转换。快了十倍。你通常关心绘画速度,这是程序中最明显的神器。
如果您关心图像文件大小,那么没有比PNG更好的选择。它通过LZW压缩压缩像素数据,典型压缩率为50%或更高。 JPEG也是一个不错的选择,更高的压缩率,但它是有损的。它通过丢弃图像细节来实现高利率。适用于没有文字或艺术线条的一般图像的照片,否则不得多次压缩。
答案 1 :(得分:0)
我试过这段代码
Public Function ConvertTo24bpp(img As Image) As Bitmap
Dim bmp = New Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb)
Using gr = Graphics.FromImage(bmp)
gr.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height))
End Using
Return bmp
End Function
ImgResult = New Bitmap(Original)
For j = 0 To Original.Height - 1
For i = 0 To Original.Width - 1
ImgResult.SetPixel(i, j, Color.FromArgb(resultArray2(j, i, 0), originalArray(j, i, 1), resultArray2(j, i, 2)))
Next
Next
Dim clone As Bitmap
clone = ConvertTo24bpp(ImgResult)
clone.Save(dlgSavePicture.FileName)
输出是24位512x512 bmp图像,但它的大小是~640 KB而不是〜678 KB
我认为输出是带有bmp扩展名的png格式
我的代码出了问题?