2010-07-07 24 views
5

這個標題幾乎可以解釋我的問題。我希望能夠使用C#以每個像素爲基礎讀取和寫入JPEG數據。如何以每個像素爲基礎讀取和寫入JPEG數據?

我想沿着CreateJPEG(x, y)的線,將設立一個空白的JPEG圖像在內存中的東西,並且會給我一個JPEG對象,然後像SetPixel(x, y, Color)GetPixel(x, y)其中後者將返回Color什麼類似。例如,您可以調用Apply()Save()方法來將圖像保存爲標準的JPEG可讀格式(最好使用壓縮選項,但這不是必需的)。

而且我假定一些C#庫或命名空間使得這一切都變得非常簡單,我只想知道最好的解決方法。

+0

請記住,當您更改JPEG編碼圖片的單個像素時,由於無損壓縮JPEG實現,圖片的更多像素將發生更改。 – 2010-07-07 08:44:23

+0

只是關於JPEG格式的說明 - 因爲它是一種有損壓縮,所以即使不直接更改它,單個像素的顏色也可能會在保存之間發生變化,因此不要依賴於保持恆定的像素顏色。 :) – 2010-07-07 08:50:16

+0

正確;)我在問,因爲我想嘗試寫一些圖像比較軟件,基本上,給出2個圖像,產生一個差異的位圖。我知道之前已經完成了,但對我來說這是一個很好的練習,而且我只需要在正確的方向上進行一個快速點(實際上SO真的很有用)。 :) – qJake 2010-07-07 09:01:29

回答

9

查看Bitmap類。除了操作單個像素之外,對於高級繪圖,您將不得不使用Graphics類。

var image = new Bitmap("foo.jpg"); 

var color = image.GetPixel(1, 2); 
image.SetPixel(42, 42, Color.White); 

image.Save("bar.jpg", ImageFormat.Jpeg); 

由於Lasse V. Karlsen在他的回答中提到,這不會真正操縱JPEG文件。 JPEG文件將被解壓縮,該圖像數據將被更改,並且保存從修改後的圖像數據創建的新JPEG文件。

這會降低圖像質量,因爲即使重新壓縮未改變的圖像,由於有損JPEG壓縮的性質,通常也不會生成位相同的JPEG文件。

有一些操作可以在JPEG文件上執行,而不需要解壓縮和重新壓縮它 - 例如旋轉90° - 放置操縱單個像素不適合此類別。

+1

「無損壓縮」?你的意思是有損。 – Dykam 2010-07-07 08:57:45

+0

很可能...:D Thx! – 2010-07-07 10:03:25

8

JPEG不是一種處理格式,它是一種存儲格式。

因此,您實際上並沒有在內存中使用JPEG圖像,您只是有圖像。只有當您存儲它時,纔會選擇格式,如PNG或JPEG。

因此,我相信你正在尋找.NET中的Bitmap類。

相關問題