2014-01-07 37 views
2

請參閱下面的代碼。如何創建一個包含真實圖像的字節數組?

我想創建一個帶有數據的字節數組,我可以將其轉換爲真實圖像。當我嘗試運行這段代碼時,我得到一個argumentException。在For循環中需要做什麼才能創建一個合法的Byte數組來存放圖像的數據?我不想使用真實圖像並將其轉換爲字節數組,我想從隨機數字創建圖像。

Random Rnd = new Random(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     Byte[] ByteArray = new Byte[1000]; 

     for (int i = 0; i < 1000; i++) 
     { 
      ByteArray[i] = Convert.ToByte(Rnd.Next(9));     
     } 
     ImageConverter Convertor = new ImageConverter(); 
     BitmapImage image = (BitmapImage)Convertor.ConvertFrom(ByteArray); 
     MyImage.Source = image; 
    } 

請注意,我不想與WinForms的類型或類似System.Drawing中/位圖書館合作 - 我只希望使用WPF技術。

+0

Rnd.Next()的輸出是什麼?請記住,您只有一個字節的大小。所以大於255的任何東西都會成爲問題。 –

+2

你能指出這種異常發生在哪裏嗎?完整的錯誤信息也不錯。 –

+0

是的,「當我嘗試運行此代碼時,我得到一個argumentException」是**不夠**繼續下去。 – spender

回答

4

這是解決方案你正在尋找,只使用WPF技術。

請注意,在步長參數計算中使用的常量值16直接來自我使用16位像素格式的事實。

private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     Random rnd = new Random(); 

     Byte[] ByteArray = new Byte[(int)MyImage.Width * (int)MyImage.Height * 3]; 

     rnd.NextBytes(ByteArray); 

     var image = BitmapSource.Create((int) MyImage.Width, (int) MyImage.Height, 72, 72, 
      PixelFormats.Bgr565, null, ByteArray, (4*((int)MyImage.Width * 16 + 31)/32)); 

     MyImage.Source = image; 
    } 
+0

感謝您的回答 - 那正是我一直在尋找的!你能解釋一下,我可以如何改變你寫的方法,以獲得只有紅色,綠色或藍色的圖片? –

+0

@StackTackTack我不確定你的意思,因爲上面的代碼生成的圖像只包含紅色,綠色和藍色的組合。你是說你只想要某些RGB的獨立組合? –

+0

您確定代碼僅創建紅色,綠色和藍色圖片嗎?因爲當我使用你的代碼時,我看到了其他顏色,如粉紅色,灰色等。 –

-3

您不能使用隨機字節來創建圖像,因爲每種類型的圖像(bmp,jpeg,png)都是以特定格式構造的。代碼不知道如何解釋隨機字節。

http://en.wikipedia.org/wiki/Image_file_formats

+0

你是正確的相關的圖像標題,但這不是他的問題的答案。 –

0

我不知道如何Converter.ConvertFrom的作品,但我喜歡做我的位圖與Bitmap.LockBits()和一點點Marshal.Copy()下級的方式。

看到這個方法:

using System.Drawing; 
    using System.Drawing.Imaging; 
    using System.Runtime.InteropServices; 

    static Bitmap CreateRandomBitmap(Size size) 
    { 
     // Create a new bitmap for the size requested. 
     var bitmap = new Bitmap(size.Width, size.Height, PixelFormat.Format32bppArgb); 

     // Lock the entire bitmap for write-only acccess. 
     var rect = new Rectangle(0, 0, size.Width, size.Height); 
     var bitmapData = bitmap.LockBits(rect, ImageLockMode.WriteOnly, bitmap.PixelFormat); 

     // Calculate the number of bytes required and allocate them. 
     var numberOfBytes = bitmapData.Stride * size.Height; 
     var bitmapBytes = new byte[numberOfBytes]; 

     // Fill the bitmap bytes with random data. 
     var random = new Random(); 
     for (int x = 0; x < size.Width; x++) 
     { 
      for (int y = 0; y < size.Height; y++) 
      { 
       // Get the index of the byte for this pixel (x/y). 
       var i = ((y * size.Width) + x) * 4; // 32bpp 

       // Generate the next random pixel color value. 
       var value = (byte)random.Next(9); 

       bitmapBytes[i] = value;   // BLUE 
       bitmapBytes[i + 1] = value;  // GREEN 
       bitmapBytes[i + 2] = value;  // RED 
       bitmapBytes[i + 3] = 0xFF;  // ALPHA 
      } 
     } 

     // Copy the randomized bits to the bitmap pointer. 
     var ptr = bitmapData.Scan0; 
     Marshal.Copy(bitmapBytes, 0, ptr, numberOfBytes); 

     // Unlock the bitmap, we're all done. 
     bitmap.UnlockBits(bitmapData); 
     return bitmap; 
    } 

然後,你可以做這樣的事情:

public void Run() 
    { 
     using(var bitmap = CreateRandomBitmap(new Size(64, 64))) 
     { 
      bitmap.Save("random.png", ImageFormat.Png); 
     } 
    } 
0

這也許會爲你做的伎倆:

private static Bitmap GenBitmap(int width, int height) { 

     int ch = 3; //number of channels (ie. assuming 24 bit RGB in this case) 
     Random rnd = new Random(); 

     int imageByteSize = width * height * ch; 

     byte[] imageData = new byte[imageByteSize]; //your image data buffer 
     rnd.NextBytes(imageData);  //Fill with random bytes; 

     Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb); 

     BitmapData bmData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); 
     IntPtr pNative = bmData.Scan0; 
     Marshal.Copy(imageData, 0, pNative, imageByteSize); 
     bitmap.UnlockBits(bmData); 
     return bitmap; 

    } 
+0

如何在不使用'system.drawing'對象的情況下製作合法的圖像數據字節數組?我只想使用ImageSource或BitmapImage。只有WPF技術。 –

相關問題