0

bmp形式を保存する私のコード:

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

コードを試してみたところ、出力は 1 メガバイト サイズの 512x512 bmp 画像です。

ms ペイントを使用して 515x512 の bmp 画像を作成すると、サイズは 768kb になります。

画像を開いてbmpとして再保存しようとしましたが、サイズはまだ1MBです

512x512 の bmp 画像サイズは 512x512 で最大 1mb にできますか? または私のコードに何か問題がありますか?

4

2 に答える 2

5

BMP は非常にシンプルな画像ファイル形式です。画像 (サイズ、ピクセル形式、解像度、カラー テーブル) を説明する小さなヘッダーと、それに続くピクセル データのブロブです。技術的には RLE で圧縮できますが、エンコーダーはもう気にしません。ピクセル データはピクセル フォーマットによって異なります。古いものは 1bpp、4bpp、8bpp で、カラー テーブルが必要です。16bpp が発生する可能性がありますが、珍しい、通常のものは 24bpp (RGB) と 32bpp (ARGB) です。つまり、1 ピクセルあたり 3 または 4 バイトです。

そうです、512 x 512 x 4 ~= 1 メガバイトです。MSPaint は、使用するピクセル形式についてかなり明示的です。これは、アルファ ブレンディング エフェクトをサポートしていない、非常に単純なペイント プログラムです。したがって、24bpp (アルファなし) を使用すると、512 x 512 x 3 ~= 786 キロバイトになります。Paint.NET を使用して 32bpp BMP を作成できます。

独自のプログラムでどちらを取得するかは、Bitmap オブジェクトの作成方法によって異なります。シンプル バージョンは、ビデオ アダプタと同じピクセル形式を使用します。32bpp の最新のすべてのマシンで。16bpp が発生する可能性がありますが、これは非常にまれです。別の形式が必要な場合は、PixelFormat 引数を取るBitmap コンストラクターを使用する必要があります。

それ以外の場合は、これを行うかなりの理由があります。デフォルトのピクセル形式は、通常、最適なものではありません。10 分の 1 で最適なものは、ビデオ アダプターのピクセル形式と正確に一致する形式です。選択肢は 32bppArgb と 32bppPArgb の間です。P は「事前乗算」を意味し、アルファ値は前もって RGB 値に適用されます。Graphics.FromImage() を使用して自分でビットマップに多くの描画を行う場合、Argb が最も効率的です。PArgb はペイントに最も効率的です。ピクセル データは、変換せずにビデオ フレーム バッファに直接ブリットできます。10 倍高速です。通常、プログラムの最も目に見えるアーティファクトである描画速度に関心があります。

画像ファイルのサイズが気になる場合は、PNG に勝るものはありません。LZW 圧縮でピクセル データを圧縮します。一般的な圧縮率は 50% 以上です。JPEG も適切な選択であり、圧縮率ははるかに高くなりますが、損失が大きくなります。画像の詳細を捨てることで高いレートを実現します。テキストや線画のない一般的な画像で、複数回圧縮する必要がない写真に適しています。

于 2015-08-09T10:42:19.800 に答える
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形式だと思います

私のコードは間違っていますか?

于 2015-08-09T13:05:02.313 に答える