2

私はScintilla ( ScintillaNETではありません) を使用しており、オート コンプリート リストで使用される画像を設定しようとしています。Scintilla には、RGBA 形式のバイト/ピクセルの文字列が必要です。

この RGBA 形式に関する Scintilla の説明: (ドキュメントからの引用)

RGBA 形式では、各ピクセルのアルファ値を使用して半透明にすることができます。XPM よりも単純で、より機能的です。

データは 4 バイトのピクセル値のシーケンスで、一番上の行のピクセルから始まり、最初に左端のピクセルが続き、後続の行のピクセルが続きます。配置上の理由から、行間にギャップはありません。

各ピクセルは、赤のバイト、緑のバイト、青のバイト、アルファ バイトの順に構成されます。カラー バイトは、アルファ値によって事前に乗算されません。つまり、25% 不透明な完全に赤いピクセルは [FF, 00, 00, 3F] になります。

上記で説明した形式を誤解していると思いますが、ドキュメントはあまり明確ではありません。

私の変換方法:

PNG をこのバイト文字列に変換する関数を作成しました。

public static string ConvertFromPNG(Bitmap PNG)
{
    string rgba = "";

    int pixWidth = PNG.Width;
    int pixHeight = PNG.Height;

    for (var y = 0; y < pixHeight; y++)
    {
        for (var x = 0; x < pixWidth; x++)
        {
            Color pix = PNG.GetPixel(x, y);

            rgba += pix.R.ToString("X2") + pix.G.ToString("X2") + pix.B.ToString("X2") + pix.A.ToString("X2");
        }
    }

    return rgba;
}

結果の画像:

しかし、Scintilla は画像を灰色のボックスとして表示しているだけです。

オートコンプリート ボックス.

問題のイメージは、 Microsoft の Babel イメージの1 つのコピーです: バベルのアイコン.

興味深いことに、バイトのセットが正しいことはわかっています。なぜなら、それらを行でフォーマットしてズームアウトすると、画像の輪郭が見えるからです。

Bytes(画像エディタでズームアウト)

生成されたバイト数:

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009F000000EC0000001B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815B0000DF9B0000F8000000B40000002F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B0000007F4E0000FDC80000FFFF0000FF720000FF1D0000B50000003E00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001613000085350000FFDE0000FFFF0000FFFF0000FFFF0000FF750000FF230000C4000000240000000000000000000000000000000000000000000000000000000000000000000000000000000000000085400000EADB0000FFF90000FFFF0000FFFF0000FFFF0000FFF60000FFA70000F5000000DA00000000000000000000000000000000000000000000000000000000000000000000000000000091810000EACA0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFBB0000FF460000FF000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000FF7E0000FFE80000FFFF0000FFFF0000FFFF0000FFFB0000FFB30000FF460000FF0C0000FF000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000FF660000FFFF0000FFFF0000FFFF0000FFC70000FF0D0000FF590000FF7A0000FF000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000FF8C0000FF7D0000FF2E0000FFFF0000FFBB0000FF1C0000FF510000FFB40000FF7B0000FF000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000FFE20000FFE40000FF410000FF8B0000FF510000FF350000FFB60000FF8F0000FF3A0000EA00000091000000000000000000000000000000000000000000000000000000000000000000000000000000DA910000F5F30000FFFF0000FF0C0000FF270000FFC10000FF930000FF220000EA0000008500000000000000000000000000000000000000000000000000000000000000000000000000000000000000241D0000C4870000FFFF0000FF270000FF420000FF9E0000FF230000FF090000860000001600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E2D0000B5610000FF120000FF1C0000FF370000FD0000007F0000001B000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002E000000B4000000F8000000DF00000081000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B000000EC0000009F0000000000000000000000000000000000000000
4

2 に答える 2

2

バイトを16進値としてフォーマットし、文字列に配置しています。Scintillaは、バイト自体が必要なだけです。

文字列ではなくバイト配列を作成し、文字列としてフォーマットするのではなく、、、、の値を直接格納pix.Rしたいと思います。pix.Gpix.Bpix.A

于 2013-03-12T16:16:49.040 に答える
0

JasonD の回答を受け入れた後、コードを更新しましたが、動作しています。それが他の誰かを助ける場合に備えて、ここに作業コードがあります:

public static byte[] ConvertFromPNG(Bitmap PNG)
{
    byte[] rgbaB = new byte[4 * (PNG.Width * PNG.Height)];

    int i = 0;

    for (var y = 0; y < PNG.Height; y++)
    {
        for (var x = 0; x < PNG.Width; x++)
        {
            Color pix = PNG.GetPixel(x, y);

            rgbaB[i++] = pix.R;
            rgbaB[i++] = pix.G;
            rgbaB[i++] = pix.B;
            rgbaB[i++] = pix.A;
        }
    }

    return rgbaB;
}
于 2013-03-12T17:58:32.013 に答える