2010-07-26 120 views
4

我將硬盤中的JPG圖像加載到字節[]中。有沒有辦法調整圖像大小(降低分辨率),而無需將其放入Bitmap對象中?C中的圖像處理#

感謝

+5

爲什麼會使用'Bitmap'不適合? – 2010-07-26 11:15:39

+2

說明:是否認爲'Bitmap'會比JPEG圖像使用更多的內存?您應該考慮只有在將整個圖像解壓縮爲位圖格式時才能調整大小。 – 2010-07-26 11:26:13

+0

我寧願避免位圖,因爲一旦你轉換爲位圖文件大小將大大增加。如果壓縮回JPG格式,則會從圖像中丟失一些信息。 – mouthpiec 2010-07-26 13:12:14

回答

3

總有辦法,但無論他們是更好的... ...一個JPG是一種壓縮的圖像格式,這意味着做任何圖像處理上它,你需要的東西來解釋這些數據。 bimap對象會爲你做這件事,但如果你想要走另一條路線,你需要研究理解jpeg規範,創建某種解析器等等。可能有快捷方式可以不需要做原始jpg的完整解釋,但我認爲這將是一個壞主意。

哦,不要忘記有不同的文件格式爲JPG明顯(JFIF和EXIF),你將ened瞭解...

我會覺得很難避免專門爲設計對象之前你正在嘗試做的事情。

+2

EXIF不是jpeg格式。 EXIF是添加到任何圖像格式的元數據。見http://en.wikipedia.org/wiki/Exchangeable_image_file_format – 2010-07-26 11:55:20

+0

@Philip Smith:從來沒有說過它是一種jpeg格式,只是它是一種文件格式。如果你從磁盤加載jpg,你仍然需要知道文件是如何構建的,這樣你就可以獲得圖像數據和元數據等等。 – Chris 2010-07-26 12:55:40

1

.jpeg文件只是一個沒有JPEG解碼器的字節。在Bitmap類中內置了一個,它可以很好地解碼.jpeg文件。結果是一個Bitmap對象,你無法解決這個問題。

它支持通過Graphics類以及Bitmap(圖像,大小)構造函數調整大小。但是,是的,製作較小的.jpeg圖像通常會生成較大的文件。這是Graphics.Interpolation模式不可避免的副作用。它試圖通過過濾器運行像素來改善縮小圖像的外觀。雙立方過濾器做得非常好。

對人眼來說看起來不錯,對JPEG編碼器看起來不怎麼樣。濾鏡會生成插值像素顏色,旨在避免在尺寸縮小時使圖像細節完全消失。然而,這些混合像素值使編碼器上的更難以壓縮圖像,從而產生更大的文件。

你可以用Graphics.InterpolationMode修改並選擇一個質量較低的過濾器。產生較差的圖像,但更容易壓縮。我懷疑你會欣賞結果。

1

這是我正在做的。

不,我不認爲你可以調整圖像的大小,而不先處理它在內存中(即在某種類型的位圖中)。

體面的質量調整大小涉及使用插值/外插算法;它不能只是「挑出每n個像素」,除非你可以與最近的鄰居解決。

這裏有一些解釋:http://www.cambridgeincolour.com/tutorials/image-interpolation.htm

protected virtual byte[] Resize(byte[] data, int width, int height) { 
var inStream = new MemoryStream(data); 
var outStream = new MemoryStream(); 

var bmp = System.Drawing.Bitmap.FromStream(inStream); 
var th = bmp.GetThumbnailImage(width, height, null, IntPtr.Zero); 
th.Save(outStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
return outStream.ToArray(); }