我有一個尺寸爲320 * 480的16位顯示器上的原始rgb數據陣列。該數組的大小爲320 * 480 * 4 = 6144000.如何在16位顯示器上縮減原始rgb數據的數組
我想知道如何在不損失圖像質量的情況下將其縮小(80 * 120)?
我發現這個鏈接關於縮放二維數組中的圖像,但我怎麼能將它應用到我的16位顯示陣列?它不是二維數組(因爲它有16位顏色)。
Image scaling and rotating in C/C++
謝謝。
我有一個尺寸爲320 * 480的16位顯示器上的原始rgb數據陣列。該數組的大小爲320 * 480 * 4 = 6144000.如何在16位顯示器上縮減原始rgb數據的數組
我想知道如何在不損失圖像質量的情況下將其縮小(80 * 120)?
我發現這個鏈接關於縮放二維數組中的圖像,但我怎麼能將它應用到我的16位顯示陣列?它不是二維數組(因爲它有16位顏色)。
Image scaling and rotating in C/C++
謝謝。
有很多縮小圖像的方法,但沒有一個可以保證不會失去「質量」。最終,信息在重新縮放過程中丟失。
你有16位顏色= 2字節,但在你的計算中使用4乘數。
也許你不需要縮小圖像大小?
一般來說,不可能在不失去質量的情況下縮放光柵圖像。一些算法使縮放幾乎沒有可見的質量鬆動。
如果您將較大的圖像縮小爲較小的圖像,將會失去圖像質量。
那麼問題是如何最大限度地減少損失。
有很多這樣做的算法,每個算法都有優缺點。
通常,您將對圖像應用某種過濾器,例如雙線或最近鄰。在ImageMagick的上下文中的這種濾波器的Here is a discussion。另外,如果輸出將低於每個像素16位,則需要執行某種形式的Color Quantization。
由於您縮小了4倍,原始圖像中每個4x4像素塊將對應於輸出圖像中的單個像素。然後,您可以循環瀏覽原始圖像中的每個4x4塊,然後將其縮小爲單個像素。一個簡單的方法(可能不是最好的方法)來做這種減少可能是取得RGB分量的平均值或中值。
您應該注意,除非原始圖像中的所有塊,每個像素都是完全相同的顏色(這是不太可能的),否則不能進行圖像縮放而不會丟失圖像質量。
我假設你的意思是一個16位rgb顯示器,而不是每個顏色(紅色,綠色和藍色)爲16位的顯示器。我還假設你知道你的r,g和b值是如何在16位空間中編碼的,因爲有two possibilities。
因此,假設您知道如何分割色彩空間,現在可以使用一系列字節數組來表示數據。什麼變得棘手的決定是是否要使用字節數組,因爲你有一個算法體可以完成這些數組的工作,但是會花費你幾個額外的比特,你可能無法花費,或者將所有東西都塞進16位格式,然後在每個16位像素的相應位上進行處理。只有你能真正回答這個問題;如果你有內存,我會選擇字節數組的方式,因爲它可能更快,你會得到一些額外的精度,使圖像看起來平滑(呃)。
鑑於這些假設,問題真的可以由您在設備上花費多少時間來回答。如果您的設備速度非常快,則可以實施Lanczos resampling。如果您的設備速度較慢,bicubic interpolation也可以很好地工作。如果你有更慢的設備,bilinear interpolation是你的朋友。
如果你真的沒有速度,我會在一些外部應用程序(比如photoshop)中重新縮放,並保存一系列隨你需要加載的位圖。
如果是16位顏色,爲什麼每個像素都是32位? – 2009-04-10 22:24:37
通常32位像素是24位彩色+8位alpha或24位彩色+8位浪費空間。 – tylerl 2009-04-10 22:43:07
它看起來像顯示器是16色不是16位? – 2009-04-11 11:07:30