1. ホーム
  2. c#

[解決済み] バイト配列からビットマップを作成するには?

2023-07-28 01:38:11

質問

バイト配列についていろいろ検索してみましたが、いつも失敗します。私はC#をコーディングしたことがなく、この方面では初心者です。バイト配列から画像ファイルを作成する方法を教えてください。

以下は、バイトを配列に格納する私の関数です。 imageData

public void imageReady( byte[] imageData, int fWidth, int fHeight))

どのように解決するのですか?

みんな、助けてくれてありがとう。私はこの答えのすべてが動作すると思います。しかし、私は私のバイト配列が生バイトを含んでいると思います。そのため、これらの解決策はすべて私のコードに作用しませんでした。

しかし、私は解決策を見つけました。多分この解決策は私のような問題を持つ他のコーダーを助けるでしょう。

static byte[] PadLines(byte[] bytes, int rows, int columns) {
   int currentStride = columns; // 3
   int newStride = columns;  // 4
   byte[] newBytes = new byte[newStride * rows];
   for (int i = 0; i < rows; i++)
       Buffer.BlockCopy(bytes, currentStride * i, newBytes, newStride * i, currentStride);
   return newBytes;
 }

 int columns = imageWidth;
 int rows = imageHeight;
 int stride = columns;
 byte[] newbytes = PadLines(imageData, rows, columns);

 Bitmap im = new Bitmap(columns, rows, stride, 
          PixelFormat.Format8bppIndexed, 
          Marshal.UnsafeAddrOfPinnedArrayElement(newbytes, 0));

 im.Save("C:\\Users\\musa\\Documents\\Hobby\\image21.bmp");

この解決策は8bit 256bpp (Format8bppIndexed)に対して有効です。もしあなたの画像が他のフォーマットである場合は PixelFormat .

そして、今、色に関する問題があります。これを解決したらすぐに、他のユーザーのために私の答えを編集します。

*PS = stride値についてはよくわかりませんが、8bitの場合は列と同じになるはずです。

また、この関数は私のために動作します... この関数は8bitのグレイスケール画像を32bitのレイアウトにコピーします。

public void SaveBitmap(string fileName, int width, int height, byte[] imageData)
        {

            byte[] data = new byte[width * height * 4];

            int o = 0;

            for (int i = 0; i < width * height; i++)
            {
                byte value = imageData[i];


                data[o++] = value;
                data[o++] = value;
                data[o++] = value;
                data[o++] = 0; 
            }

            unsafe
            {
                fixed (byte* ptr = data)
                {

                    using (Bitmap image = new Bitmap(width, height, width * 4,
                                PixelFormat.Format32bppRgb, new IntPtr(ptr)))
                    {

                        image.Save(Path.ChangeExtension(fileName, ".jpg"));
                    }
                }
            }
        }