2010-02-03 58 views
4

這裏似乎有許多圖片框問題,但我還沒有找到任何處理將圖片框的內容更改爲不是簡單地從文件加載的位圖的問題。如何將生成的位圖加載到PictureBox中?

我的應用程序需要一個字節數組,並從它們生成一個位圖。我真的想避免寫入文件作爲中間處理步驟。

因爲它是一個字節數組而不是2個字節的字,所以我需要用灰度調色板創建索引位圖。

然後,我將索引位圖轉換爲正常位圖(24位rgb)。

這是產生誤差爲我的代碼:

pictureBox1.Image = (System.Drawing.Image)bmp2; 

當我觀看的形式(在PictureBox試圖繪製),該線程將簡單地停止執行與消息: 「無效參數在System.Drawing.Image.get_RawFormat()「

我在做什麼錯?我怎樣才能爲picturebox創建一個安全的位圖?

這是創建「BMP2」:如果我使用bmp1.Save(@「testfile.bmp」)

//creating the bitmap from the array 
System.Drawing.Bitmap bmp1 = new System.Drawing.Bitmap(100, 100, 100, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, MyIntPtr); 

//creating a proper indexed palette 
System.Drawing.Imaging.ColorPalette GrayPalette = bmp1.Palette; 
for (int i = 0; i < GrayPalette.Entries.Length; i++) 
{ 
    GrayPalette.Entries[i] = Color.FromArgb(i, i, i); 
} 
bmp1.Palette = GrayPalette; 

//creating a non-indexed, 24bppRGB bitmap for picturebox compatibility 
System.Drawing.Bitmap bmp2 = new Bitmap(bmp1.Width, bmp1.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
Graphics gr = Graphics.FromImage(bmp2); 
gr.DrawImage(bmp1, 0, 0); 
gr.Dispose(); 

我得到的似乎是無異常的一個完全可以接受的位圖。

爲什麼我不能使用我的位圖作爲我的picturebox.Image? 在加載新位圖之前,我需要更改picturebox的其他參數嗎?

回答

4

嗯,我發現我在做什麼的問題。

我會盡力解釋什麼是錯誤的,但作爲一個非專業人士,我不確定我會如何準確。

顯然在pictureBox中設置圖像不會在任何地方複製內存。後來在我的應用程序(遠離代碼片段的一些功能)中,我正在處理變量「bmp1」。

我沒有意識到與bmp1相關的內存在函數傳遞它的任何地方都是相同的內存,並且在銷燬它時,引發了錯誤「System.Drawing.Image.get_RawFormat()中的無效參數」。我想這是因爲每當pictureBox被重繪時,它都會使用它的「Image」屬性來繪製。因爲我正在處理與「Image」屬性相關聯的內存,所以我正在殺死所有正在工作的picturebox_Paint事件的希望。

我只希望我現在沒有內存泄漏,因爲我從不處理任何創建的位圖。

+0

GC應該照顧內存。 – SLaks 2010-02-03 15:35:41

+0

@SLaks:GC將處理內存,但不會釋放Bitmap對象使用的本地資源。有一個IDisposable接口的原因,使用它。 – 2010-06-22 22:28:51

+0

@EdSwangren:**錯誤**。擁有本地資源的「IDisposable」對象會將本地資源置於終結器中。請參閱處理模式。 – SLaks 2010-06-22 22:54:17

相關問題