2009-07-06 37 views
2

我正在從jpg文件加載位圖。如果圖像不是24位RGB,我想轉換它。轉換應該相當快。我正在加載的圖像最大(9000 * 9000像素,壓縮尺寸爲40-50MB)。如何才能做到這一點?如何讀取和修改c中圖像的顏色空間#

btw:如果可能,我不想使用任何外部庫。但是如果您知道執行最常見映像任務的開源工具類,我很樂意聽到它。提前致謝。

回答

2

jpeg應該以0xFF 0xD8開頭。之後,你會發現在格式各個領域:

  1. 字段標識符2個字節
  2. 字段長度,不包括字段標識符。 2個字節。
  3. 變量數據。

解析字段。您要查找的標識符是0xFF 0xC0。這稱爲SOF0,包含高度,寬度,位深度等。0xFF 0xC0後面跟着兩個字節的字段長度。緊隨其後的是單個字節,顯示位深度,通常爲8.然後將有兩個字節表示高度,兩個表示寬度,一個字節表示組件的數量;這通常是1(對於灰度)或3(對於顏色)

0

這不是我自己試過的東西,但我認爲你可能需要將圖片的EXIF信息作爲開始。

查看Scott Hanselman的博客條目on accessing EXIF information from pictures

+1

Exif-Data只是與圖像關聯的普通可選元數據。修改Exif-Data不會更改圖像上的任何內容。但無論如何感謝您的答案。 – Mats 2009-07-06 11:36:49

0

標準.NET System.Drawing命名空間應該有你需要的所有, 但它可能不會很有效。它會將整個內容加載到RAM中,解壓縮,轉換(可能通過複製),然後重新壓縮並保存。如果您的目標是高性能,恐怕您可能需要查看C/C++庫併爲它們創建.NET包裝器。

0

據我所知,jpg總是24 bpp。唯一可能改變的是它是CMY(K?)而不是RGB。該信息將存儲在標題中。不幸的是,我沒有任何創建CMYK圖像的方法來測試加載到位圖中是否會自動轉換它。

下面一行將文件讀入到內存:

Bitmap image = Image.FromFile(fileName); 

image.PixelFormat會告訴你的圖像格式。但是,我無法測試文件加載對除24bpp RGB jpgs以外的文件所做的操作。我只能建議你嘗試一下。

+0

我相信,那個jpg可以在24位和8位深度,這是一個灰度圖像。 – Mats 2009-07-06 11:52:23