2012-07-31 91 views
0

我有一個圖像寬度/高度/跨度和緩衝區。C#將步幅/緩衝區/寬度/高度轉換爲位圖

如何將此信息轉換爲System.Drawing.Bitmap?如果我有這4件事情,我可以得到原始圖像嗎?

+0

HTTP://whathaveyoutried.com/...表現出一定的代碼... – 2012-07-31 11:41:49

+0

你的意思是說上傳時想要以二進制格式將圖像保存到數據庫中,並檢索值並顯示爲圖像? – 2012-07-31 11:42:53

+0

我的意思是有人編寫了一個代碼來獲取攝像機的高度/寬度/跨度/緩衝區。他現在要我做點什麼。我想使用位圖圖像,他使用writeablebitmap並告訴我如何獲得步幅/寬度等... – Mattb2291 2012-07-31 12:04:19

回答

1

有一個Bitmap構造函數重載,這需要你擁有的一切(加PixelFormat):

public Bitmap(int width, int height, int stride, PixelFormat format, IntPtr scan0);

這可能會實現(如果args.Buffer是blittable類型的數組,像byte爲例):

Bitmap bitmap; 
var gch = System.Runtime.InteropServices.GCHandle.Alloc(args.Buffer, GCHandleType.Pinned); 
try 
{ 
    bitmap = new Bitmap(
     args.Width, args.Height, args.Stride, 
     System.Drawing.Imaging.PixelFormat.Format24bppRgb, 
     gch.AddrOfPinnedObject()); 
} 
finally 
{ 
    gch.Free(); 
} 

更新:

Probabl y最好是將圖像字節手動複製到新創建的Bitmap,因爲它好像構造函數沒有這樣做,並且如果byte[]圖像數據數組被垃圾收集,可能會發生各種不好的事情。

var bitmap = new Bitmap(args.Width, args.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
var data = bitmap.LockBits(
    new Rectangle(0, 0, args.Width, args.Height), 
    System.Drawing.Imaging.ImageLockMode.WriteOnly, 
    System.Drawing.Imaging.PixelFormat.Format24bppRgb); 

if(data.Stride == args.Stride) 
{ 
    Marshal.Copy(args.Buffer, 0, data.Scan0, args.Stride * args.Height); 
} 
else 
{ 
    int arrayOffset = 0; 
    int imageOffset = 0; 
    for(int y = 0; y < args.Height; ++y) 
    { 
     Marshal.Copy(args.Buffer, arrayOffset, (IntPtr)(((long)data.Scan0) + imageOffset), data.Stride); 
     arrayOffset += args.Stride; 
     imageOffset += data.Stride; 
    } 
} 

bitmap.UnlockBits(data); 
+0

我所給出的是我可以在參數 中找到步幅/緩衝區等ie - > args .Buffer = buffer ... args.Stride = stride等 但是使用 位圖測試=新的位圖(args.Width,args.Height,args.Stride,PixelFormats.Rgb24,args.Buffer); 給了我一個錯誤:(我有點新的圖像編程... – Mattb2291 2012-07-31 12:02:09

+0

這個工作......好吧......讓我到某個地方......? var test = BitmapFrame.Create(args.Width, args.Height,300D,300D,PixelFormats.Rgb24,null,args.Buffer,args.Stride); – Mattb2291 2012-07-31 12:14:49

+0

'args.Buffer'' byte []'還有'System.Drawing.Bitmap'和'BitmapFrame '來自2個不同的GUI框架,你必須決定使用什麼 – max 2012-07-31 12:18:26

0

,如果你有緩衝區的字節[],寬度和高度+的像素格式(跨步)這應該工作

public Bitmap CreateBitmapFromRawDataBuffer(int width, int height, PixelFormat imagePixelFormat, byte[] buffer) 
    { 
     Size imageSize = new Size(width, height); 

     Bitmap bitmap = new Bitmap(imageSize.Width, imageSize.Height, imagePixelFormat); 
     Rectangle wholeBitmap = new Rectangle(0, 0, bitmap.Width, bitmap.Height); 

     // Lock all bitmap's pixels. 
     BitmapData bitmapData = bitmap.LockBits(wholeBitmap, ImageLockMode.WriteOnly, imagePixelFormat); 

     // Copy the buffer into bitmapData. 
     System.Runtime.InteropServices.Marshal.Copy(buffer, 0, bitmapData.Scan0, buffer.Length); 

     // Unlock all bitmap's pixels. 
     bitmap.UnlockBits(bitmapData); 

     return bitmap; 
    } 
相關問題