我正在從jpg文件加載位圖。如果圖像不是24位RGB,我想轉換它。轉換應該相當快。我正在加載的圖像最大(9000 * 9000像素,壓縮尺寸爲40-50MB)。如何才能做到這一點?如何讀取和修改c中圖像的顏色空間#
btw:如果可能,我不想使用任何外部庫。但是如果您知道執行最常見映像任務的開源工具類,我很樂意聽到它。提前致謝。
我正在從jpg文件加載位圖。如果圖像不是24位RGB,我想轉換它。轉換應該相當快。我正在加載的圖像最大(9000 * 9000像素,壓縮尺寸爲40-50MB)。如何才能做到這一點?如何讀取和修改c中圖像的顏色空間#
btw:如果可能,我不想使用任何外部庫。但是如果您知道執行最常見映像任務的開源工具類,我很樂意聽到它。提前致謝。
jpeg應該以0xFF 0xD8開頭。之後,你會發現在格式各個領域:
解析字段。您要查找的標識符是0xFF 0xC0。這稱爲SOF0,包含高度,寬度,位深度等。0xFF 0xC0後面跟着兩個字節的字段長度。緊隨其後的是單個字節,顯示位深度,通常爲8.然後將有兩個字節表示高度,兩個表示寬度,一個字節表示組件的數量;這通常是1(對於灰度)或3(對於顏色)
這不是我自己試過的東西,但我認爲你可能需要將圖片的EXIF信息作爲開始。
查看Scott Hanselman的博客條目on accessing EXIF information from pictures。
標準.NET System.Drawing
命名空間應該有你需要的所有, 但它可能不會很有效。它會將整個內容加載到RAM中,解壓縮,轉換(可能通過複製),然後重新壓縮並保存。如果您的目標是高性能,恐怕您可能需要查看C/C++庫併爲它們創建.NET包裝器。
據我所知,jpg總是24 bpp。唯一可能改變的是它是CMY(K?)而不是RGB。該信息將存儲在標題中。不幸的是,我沒有任何創建CMYK圖像的方法來測試加載到位圖中是否會自動轉換它。
下面一行將文件讀入到內存:
Bitmap image = Image.FromFile(fileName);
image.PixelFormat
會告訴你的圖像格式。但是,我無法測試文件加載對除24bpp RGB jpgs以外的文件所做的操作。我只能建議你嘗試一下。
我相信,那個jpg可以在24位和8位深度,這是一個灰度圖像。 – Mats 2009-07-06 11:52:23
Exif-Data只是與圖像關聯的普通可選元數據。修改Exif-Data不會更改圖像上的任何內容。但無論如何感謝您的答案。 – Mats 2009-07-06 11:36:49