none
如何將byte[,]資料在picturebox秀圖? RRS feed

所有回覆

  • 怎麼會有影像是用二維陣列來當內容?

     

    MemoryStream 也只接受一維陣列的 byte[],你可能要想辦法把它變成 byte[],才可以用 MemoryStream 再加上 Image.FromStream() 把它變成影像檔。

     

    2008年10月3日 上午 08:28
    版主
  • 謝謝你的回答,那方便可以提供一個範例看一下嗎?
    2008年10月3日 上午 08:57
  • 參考這裡

    http://debut.cis.nctu.edu.tw/~ching/Course/AdvancedC++Course/__Page/Advanced_PChome/page.html

     

                // 傳回 RGB 陣列資訊"開始 RGB 彩色資訊讀取
                public int[, ,] getRGBData()
                {
                    // Step 1: 利用 Bitmap 將 image 包起來
                    Bitmap bimage = new Bitmap(image);
                    int Height = bimage.Height;
                    int Width = bimage.Width;
                    int[, ,] rgbData = new int[Width, Height, 3];
                    // Step 2: 取得像點顏色資訊
                    for (int y = 0; y < Height; y++)
                    {
                        for (int x = 0; x < Width; x++)
                        {
                            Color color = bimage.GetPixel(x, y);
                            rgbData[x, y, 0] = color.R;
                            rgbData[x, y, 1] = color.G;
                            rgbData[x, y, 2] = color.B;
                        }
                    }
                    return rgbData;
                }

     

     跟這個

               public static Bitmap CreateBitmap(int[, ,] rgbData)
                {
                    int Width = rgbData.GetLength(0);
                    int Height = rgbData.GetLength(1);

                    Bitmap bimage = new Bitmap(Width, Height, PixelFormat.Format24bppRgb);

                    // Step 1: 先鎖住存放圖片的記憶體
                    BitmapData bmData = bimage.LockBits(new Rectangle(0, 0, Width, Height),
                                                   ImageLockMode.WriteOnly,
                                                   PixelFormat.Format24bppRgb);
                    int stride = bmData.Stride;

                    // Step 2: 取得像點資料的起始位址
                    System.IntPtr Scan0 = bmData.Scan0;

                    // 計算每行的像點所佔據的byte 總數
                    int ByteNumber_Width = bimage.Width * 3;

                    // 計算每一行後面幾個 Padding bytes
                    int ByteOfSkip = stride - ByteNumber_Width;


                    // Step 3: 直接利用指標, 把影像資料取出來
                    unsafe
                    {
                        byte* p = (byte*)(void*)Scan0;
                        for (int y = 0; y < Height; y++)
                        {
                            for (int x = 0; x < Width; x++)
                            {
                                p[0] = (byte)rgbData[x, y, 2]; // 先放 B
                                ++p;
                                p[0] = (byte)rgbData[x, y, 1];  // 再放 G
                                ++p;
                                p[0] = (byte)rgbData[x, y, 0];  // 最後放 R 
                                ++p;
                            }
                            p += ByteOfSkip; // 跳過剩下的 Padding bytes
                        }
                    }

                    bimage.UnlockBits(bmData);
                    return bimage;
                }

    速度蠻快的
    2008年10月15日 下午 01:16