計算機中的圖片為什麼都是矩形的?顯示圓形也只能周圍透明?
不明白為什麼沒有圓形的圖片?
1. 為什麼計算機的圖中是矩形?
不含壓縮的圖片,一般是以矩形的點陣圖(bitmap)來表示。這樣的好處是可以簡單快速訪問某(x, y)的像素。用C來表示是:
(uint8_t*)image + y * bytePerRow + x * bytePerPixel
大部分的圖像感應設備(image sensor)、顯示設備(display device)、列印設備等的有效範圍大多數也都是矩形。既然最大可用的範圍是矩形,儲存時都用矩形就最簡單。
2. 為什麼這些設備的輸入/輸出形狀是矩形?
可能是因為紙張是矩形,後來的畫布、膠捲等都是矩形。
3. 為什麼紙張等物料是矩形?
因為矩形可以密鋪,這樣切割比較省材料。其他可密鋪的圖形可能不太適合書寫,例如正三角形、平行四邊形、正六邊形等。密鋪正六邊形時,其邊界不是直線也是一個問題。
4. 那麼,計算機里,是否有非矩形的圖片?
我在二十年前左右寫2D遊戲時,的確會用到一種壓縮方法去儲存精靈(sprite,即1-bit alpha image)。
那種方法可算是遊程編碼(run-length encoding, RLE)。其方法是,儲存連續透明或不透明的像素數目,然後再儲存顏色。例如,原始點陣圖中一行像素如下:
00000000123456789000012345678900000000000000
當中0表示透明,其他表示不透明的顏色,那麼可以用RLE方式儲存為:
8 9 123456789 4 9 123456789 14
第一個8表示有8個透明像素,之後的9表示9個不透明像素,接下來就是那9個不透明像素的顏色,如此類推。
這種做法在當時PC使用CPU來畫像素的年代是有用的,因為這樣可以減少內存用量,而且能快速跳過連續透明的部分(大部分sprite含這種性質),又不需要逐象素檢查是否透明。但現在渲染sprite的功能都用GPU實現,所以基本上不太適用。
5. 除此以外,我可以把圖片儲存成特定的形狀么?
絕對可以。例如你設計了一個硬體是用來拍攝天空,使用了魚眼鏡頭,拍出來的相片是這樣子的:
圖片來源:Blender 3D: Noob to Pro/Build a skybox在內存儲存時,也可以只儲存圓形內的有效象素,節省21%的內存。訪問時利用一個查找表把 y 坐標轉換成該行第一個像素的地址。
其實你可以自定義一張圓形的圖片格式。比如一個圓形按角度和圈數來分,比如分成200圈,每圈分成360段。用程序顯示的時候,你再轉換成矩陣形式顯示。不過這種圖片肯定不如方形的好。
因為照片、圖紙、文件等都是矩形的,作為載體,圖片也是矩形的是自然而然的。
發明一種圓形的圖片格式在理論上是可行的,但是因為沒人會支持你這種格式,所有的上下游的相關軟體都得自己寫:給瀏覽器寫插件,給印表機寫驅動,自己搞圖片編輯軟體,自己搞圖片瀏覽軟體……
而且因為他承載的照片是矩形的,所以照片的四周也會留有大片的透明。
[貼書是最合適的了。。。
後面就不貼了.
慾望的教育 (豆瓣)
不排除你可以自己定義一套圓形圖片格式並將其顯示的方法,但毫無疑問你會面對難以轉換成其它格式以及不能被各種圖形處理軟體渲染引擎識別的困境。在你定義的這種格式沒有非常吸引人的好處的時候一般人是不會接受它的。
當然為什麼早期人們都使用矩形圖片..可以認為這是由於矩形圖片在大多數場合都更加通用,存儲讀取方式簡單,更符合人們對於圖片的原型相片的直觀理解,在排版的時候更容易控制,並且之間不會留下空隙等等等等因素造成的。極坐標的變換太複雜了。樓主可以試試直角坐標中(x, y) + (a, b) = (x + a, y + b)這麼簡單的向量加法在極坐標下的計算。
坐標系的原因吧?
不論是顯示器還是存儲方式都是直角坐標系。
若都改成極坐標系或許可以以圓的方式存儲。
因為計算機圖片是顯示在顯示器上的,而現代顯示器背後的驅動面板,也即TFT,是一個N行乘以M列的矩形陣列(如1024x768)。顯示陣列的最基本組成元素是像素,每一個像素本身即是一個近似的小矩形的形狀。以這樣的矩形像素為基礎來組成圖形和圖片,自然組成矩形的圖片是最簡單和直接的了。
因為柵格數據結構最直觀而簡單。
http://en.wikipedia.org/wiki/Raster_scan
http://en.wikipedia.org/wiki/Raster_graphics
點陣圖的話,因為存儲的是對圖中每個點的描述,所以實際上整個圖片是可以想像成一個二維數組(好吧,實際是一維存儲的,使用長寬信息控制)。這樣應該可以理解為何為矩形。
矢量圖理論上應該可以不描述冗餘信息,但渲染引擎渲染為矩形應該是比較符合引擎處理流水線的。
大概應該是這個意思,不是"專業搞圖像的,等大神專業解釋吧。
另外建議題主了解一下主流圖片格式的數據結構。因為顯示器是方噠~
推薦閱讀:
※是什麼限制了遊戲或實時圖形, 以至於遠景如山脈, 天空都是紙片貼圖?
※為什麼Unreal 4引擎能輕易實時渲染出vray要花半天才能渲染出的場景?
※如何證明行列式值能表示一個平行六面體的體積?
※如何對球體和長方體進行碰撞檢測?