2009-04-10 26 views
2

我有一個尺寸爲320 * 480的16位顯示器上的原始rgb數據陣列。該數組的大小爲320 * 480 * 4 = 6144000.如何在16位顯示器上縮減原始rgb數據的數組

我想知道如何在不損失圖像質量的情況下將其縮小(80 * 120)?

我發現這個鏈接關於縮放二維數組中的圖像,但我怎麼能將它應用到我的16位顯示陣列?它不是二維數組(因爲它有16位顏色)。

Image scaling and rotating in C/C++

謝謝。

+0

如果是16位顏色,爲什麼每個像素都是32位? – 2009-04-10 22:24:37

+0

通常32位像素是24位彩色+8位alpha或24位彩色+8位浪費空間。 – tylerl 2009-04-10 22:43:07

+0

它看起來像顯示器是16色不是16位? – 2009-04-11 11:07:30

回答

2

有很多縮小圖像的方法,但沒有一個可以保證不會失去「質量」。最終,信息在重新縮放過程中丟失。

0

你有16位顏色= 2字節,但在你的計算中使用4乘數。
也許你不需要縮小圖像大小?

一般來說,不可能在不失去質量的情況下縮放光柵圖像。一些算法使縮放幾乎沒有可見的質量鬆動。

5

如果您將較大的圖像縮小爲較小的圖像,將會失去圖像質量。

那麼問題是如何最大限度地減少損失。

有很多這樣做的算法,每個算法都有優缺點。

通常,您將對圖像應用某種過濾器,例如雙線或最近鄰。在ImageMagick的上下文中的這種濾波器的Here is a discussion。另外,如果輸出將低於每個像素16位,則需要執行某種形式的Color Quantization

0

由於您縮小了4倍,原始圖像中每個4x4像素塊將對應於輸出圖像中的單個像素。然後,您可以循環瀏覽原始圖像中的每個4x4塊,然後將其縮小爲單個像素。一個簡單的方法(可能不是最好的方法)來做這種減少可能是取得RGB分量的平均值或中值。

您應該注意,除非原始圖像中的所有塊,每個像素都是完全相同的顏色(這是不太可能的),否則不能進行圖像縮放而不會丟失圖像質量。

3

我假設你的意思是一個16位rgb顯示器,而不是每個顏色(紅色,綠色和藍色)爲16位的顯示器。我還假設你知道你的r,g和b值是如何在16位空間中編碼的,因爲有two possibilities

因此,假設您知道如何分割色彩空間,現在可以使用一系列字節數組來表示數據。什麼變得棘手的決定是是否要使用字節數組,因爲你有一個算法體可以完成這些數組的工作,但是會花費你幾個額外的比特,你可能無法花費,或者將所有東西都塞進16位格式,然後在每個16位像素的相應位上進行處理。只有你能真正回答這個問題;如果你有內存,我會選擇字節數組的方式,因爲它可能更快,你會得到一些額外的精度,使圖像看起來平滑(呃)。

鑑於這些假設,問題真的可以由您在設備上花費多少時間來回答。如果您的設備速度非常快,則可以實施Lanczos resampling。如果您的設備速度較慢,bicubic interpolation也可以很好地工作。如果你有更慢的設備,bilinear interpolation是你的朋友。

如果你真的沒有速度,我會在一些外部應用程序(比如photoshop)中重新縮放,並保存一系列隨你需要加載的位圖。

相關問題