3

私は 16 ビット アセンブリ プログラムを作成していますが、作業中のグラフィック モードは、1 バイトで書き込まれるピクセルあたり 256 色しかサポートしていません。つまり、ピクセルを描画するために 1 バイトのカラー値しか指定できません。画像を 8 ビット深度のビットマップに変換しましたが、Visual Basic で各ピクセルの色の値を取得しようとしているので、アセンブリ プログラムでこれらの値を使用できますが、RGB 値を取得していて、それらの RGB を変換しようとすると値を 1 バイトに変換すると、256 より大きい数値が得られるため、グラフィック モードでは使用できません。ここに私が持っているものがあります:

Dim myBitmap As New Bitmap("images.bmp")
Dim output As New System.IO.StreamWriter("colors.txt", False)
Dim pixelColor As Color
Dim rgb As Integer

For x As Integer = 1 To myBitmap.Width - 1 Step 1
            pixelColor = myBitmap.GetPixel(x, y)
            rgb = CUInt(pixelColor.B) + CUInt((pixelColor.G << 8)) + CUInt((pixelColor.R << 16))
            output.WriteLine(rgb.ToString)

        Next x

    Next y
output.Close()

実際に256よりも高い値を示している行は次のとおりです。

rgb = CUInt(pixelColor.B) + CUInt((pixelColor.G << 8)) + CUInt((pixelColor.R << 16))

3つのRGB値をまとめて1バイトに変換、マージ、または近似する方法は実際にありますか? (255 を超えることはできません)



編集: 私たちはすでに VB のネットに取り組んでいるので、Davidが書いた変換ロジックを使用してコードの作業行を書きましょう:

rgb = ((pixelColor.R / 32) << 5) + ((pixelColor.G / 32) << 2) + (pixelColor.B / 64)

ありがとうデビッド。

4

1 に答える 1

5

赤の値に 3 ビット、緑の値に 3 ビット、青の値に 2 ビットを使用します。ウィキペディアの8 ビット カラーに関するページでよく説明されています。

変換ロジックは次のとおりです。

[(Red / 32) << 5] + [(Green / 32) << 2] + (Blue / 64)
于 2012-08-31T22:06:38.240 に答える