精華區beta Programming 關於我們 聯絡資訊
==> 於 Cheng Tom (newsgate@teatime.com.tw) 文中述及: : fu> 請問把一個像是bmp的圖檔從600*800 變成300*400要怎麼做? : 這需看你使用何種語言。 演算法跟用那一種程式那有關係 ? 拜託... 回正題. 最簡單就跳一個 pixel 取值就可以了...不過很可能會大量失真... -- 初一 Ξ Origin: 中正大學寂寞芳心小站 <bbs.ccu.edu.tw> [FROM: 140.123.108.142] > -------------------------------------------------------------------------- < 發信人: lkl.bbs@bbs.ccns.ncku.edu.tw (喜歡寫程式), 看板: Programming 標 題: Re: 請問改變圖形檔大小的演算法? 發信站: 夢之大地 (Fri Dec 25 18:38:03 1998) 轉信站: Ptt!news.ntu!ctu-gate!news.nctu!suncc.ccu!ccnews.nsysu!news.civil.ncku ※ 引述《garyhu.bbs@bbs.ccu.edu.tw (初一)》之銘言: : ==> 於 Cheng Tom (newsgate@teatime.com.tw) 文中述及: : : fu> 請問把一個像是bmp的圖檔從600*800 變成300*400要怎麼做? : : 這需看你使用何種語言。 : 演算法跟用那一種程式那有關係 ? 拜託... : 回正題. 最簡單就跳一個 pixel 取值就可以了...不過很可能會大量失真... 先對 x 部份 每兩個 pixel 取平均值為新的 pixel 的值 再對 y 部份做. 或對 2x2 的 block 取平均值做新的 pixel 值 lkl -- ※ 發信站: 夢之大地(bbs.ccns.ncku.edu.tw)◆ From: eesol01.ee.ncku.edu.tw > -------------------------------------------------------------------------- < 發信人: futuredragon.bbs@cszone.cc.ntu.edu.tw (futuredragon), 看板: Programming 標 題: Re: 請問改變圖形檔大小的演算法? 發信站: 程式設計樂園(CSZone) (Mon Dec 28 21:56:37 1998) 轉信站: Ptt!news.ntu!CSZone ※ 引述《lkl.bbs@bbs.ccns.ncku.edu.tw (喜歡寫程式)》之銘言: : ※ 引述《garyhu.bbs@bbs.ccu.edu.tw (初一)》之銘言: : : 演算法跟用那一種程式那有關係 ? 拜託... : : 回正題. 最簡單就跳一個 pixel 取值就可以了...不過很可能會大量失真... : 先對 x 部份 每兩個 pixel 取平均值為新的 pixel 的值 : 再對 y 部份做. : 或對 2x2 的 block 取平均值做新的 pixel 值 : lkl 哪麼請問怎樣才能任意比例縮放呢? 我看線代課本上有圖形解析度的問題, 請問有沒有關係呢? -- ※ Origin: 程式設計樂園 ◆ From: yaoyi.DormH.nsysu.edu.tw > -------------------------------------------------------------------------- < 作者: hotball (哲哲魚) 看板: Programming 標題: Re: 請問改變圖形檔大小的演算法? 時間: Tue Dec 29 01:26:35 1998 ※ 引述《futuredragon.bbs@cszone.cc.ntu.edu.tw (futuredragon)》之銘言: : ※ 引述《lkl.bbs@bbs.ccns.ncku.edu.tw (喜歡寫程式)》之銘言: : : 先對 x 部份 每兩個 pixel 取平均值為新的 pixel 的值 : : 再對 y 部份做. : : 或對 2x2 的 block 取平均值做新的 pixel 值 : : lkl : 哪麼請問怎樣才能任意比例縮放呢? : 我看線代課本上有圖形解析度的問題, : 請問有沒有關係呢? 用 bilinear filter 可以得到還可以的效果(放大的時候)。 縮小的時候用 super sampling 可能會比較好。 -- ※ 發信站: 批踢踢實業坊(ptt.twbbs.org) ◆ From: kimicat.m1.ntu. > -------------------------------------------------------------------------- < 發信人: jgjsbee.bbs@bbs.cs.nthu.edu.tw (我怕熱訊), 看板: Programming 標 題: Re: 請問改變圖形檔大小的演算法? 發信站: 清華資訊(楓橋驛站) (Tue Dec 29 19:00:17 1998) 轉信站: Ptt!news.ntu!news.mcu!news.cs.nthu!maple ※ 引述《futuredragon.bbs@cszone.cc.ntu.edu.tw (futuredragon)》之銘言: > ※ 引述《lkl.bbs@bbs.ccns.ncku.edu.tw (喜歡寫程式)》之銘言: > : 先對 x 部份 每兩個 pixel 取平均值為新的 pixel 的值 > : 再對 y 部份做. > : 或對 2x2 的 block 取平均值做新的 pixel 值 > : lkl > 哪麼請問怎樣才能任意比例縮放呢? > 我看線代課本上有圖形解析度的問題, > 請問有沒有關係呢? 任意縮放: 這要倒著算才行. 例如 I0 = 原始影像 I3 = 長寬皆為原來 1/3 的影像 今欲得 I3(x,y) 之 pixel value ,可知 I3(x,y)=I0(3*x, 3*y) , 設 u=3*x , v=3*y 若 u , v 為整數(格子點,即本例),沒問題,直接把 I0(u,v) 填到 I3(x,y) 即可. 若 u,v 非整數(如 In, n非整數), 那麼可由附近的格子點內插得 pixel value. -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: Sam-pii-jgj.ee.ccu.edu.tw > -------------------------------------------------------------------------- < 發信人: "青衫" <cin@jstek.com.tw>, 看板: Programming 標 題: Re: 請問改變圖形檔大小的演算法? 發信站: SEEDNet News Service (Wed Dec 30 09:53:09 1998) 轉信站: Ptt!news.ntu!feeder.seed.net.tw!news.seed.net.tw!not-for-mail > > 哪麼請問怎樣才能任意比例縮放呢? 參考我以前寫的文章, 雖然文中以黑白影像為主, 但觀念可擴增至彩色影像. 我曾依次寫出處理黑白,16色1bit/4plane,16色4bit/1plane,256色,全彩24bit,全彩32bit 等各類影像的縮放程式, 速度都還表現的不錯. 不過現在影像lib很普遍, 其實 可直接用影像lib便可以了, 反正也不貴... ------------------------------------------------------------------------- 影像資料的放大縮小,係其實便是一種位置對映的關係。由於二維的位置 對映轉換計算和一維類似,因此我們先簡化,只從水平方向的縮放來考慮: 0110 放大2倍 00111100 縮小2倍 01 解決的方法有兩種:一種是由原始影像的資料算出放大到目的影像所佔的區域, 從而決定目的影像各點的值;一種是由目的影像各點找出所對應的原始影像區 域,然後決定該目的影像點的值。很明顯的,以原始影像為主進行計算,比較 適用於影像放大的情況,因為此時原始影像的點數較少,因此對映轉換的計算 次數也會較少。同樣的,以目的影像為主進行計算,則較適用於影像縮小的情 況,其道理也是相同的。這個部份我們會在後面加以證明。 一.原始影像為主進行計算 這個方法的對映轉換計算,通常不以一點一點來各自算出對應範圍,而是 直接取出一段一段相同值的點範圍來算出其對應範圍,亦即先找出水平線再縮 放的觀念。至於將求出的對應範圍全部設成某個值,亦可利用類似畫水平線的 方法來加速,避免一個位元一個位元的設值。(畫水平線的速度一定快於畫斜 線,不是嗎?) 二.目的影像為主進行計算 這個方法在對映轉換計算上,比較難找到連續點與原始影像的相關性,只 能一點一點來各自算出對應範圍,然後從對應範圍的原始影像值中決定該點的 值,一般是隨便挑一點來用。這個方法能夠加速的部份,只是在對映轉換的計 算上,儘量用加減來取代乘除的運算。這點倒是可運用Bresenham畫線演算法中 的點座標計算公式來改良。 雖然大致而言,以原始影像為主進行計算的方式適用於影像放大,而以目 的影像為主進行計算的方式適用於影像縮小,但也並非完全可以如此劃分。因 為以原始影像為主進行計算的方式,利用了水平線縮放的觀念,當縮小的倍數 不大時,仍可能快過以目的影像為主進行計算的方式。但是究竟要如何劃分呢? 我們從數理上來推衍。假設s為原始影像水平大小,t為目的影像水平大小,則 (可參照後面所列之程式來看會比較清楚): 1.原始影像為主進行計算需2~s次對映計算、s次原始影像取值、t/8~t 次目的影像寫值(最佳情況為一直線,最差情況為網點)。 2.目的影像為主進行計算需t次對映計算、t次原始影像取值、t次目的影像 寫值。 如果我們以對映計算為主加以分析(因為對映計算部份最花時間),則在最差 情況下,當s<=t時,也就是影像放大的情況下,以原始影像為主進行計算會比 較快些。在最佳情況下,t<=2,亦即影像縮至很小時,以目的影像為主進行計 算會比較快些。在平均情況下,當s<=2t時,也就是影像縮小不到2倍時,以原 始影像為主進行計算才會比較快些。不過由於以目的影像為主進行計算的方式, 可在對映計算上改進來加快速度,而且原始影像取值的次數也隨著影像縮小而 較少,因此這個倍率應該會更小些,至於小多少,可能要取決於兩種方式對於 對映計算上的速度。我們以一些測試數據來觀察。下面便是以128x128影像進行 水平放大1000次的執行時間列表,其中方式一改良版指對映計算部份改成使用 組合語言,方式二改良版則指利用Bresenham畫線計算公式改進對映計算部份。 ┌──────┬──────┬──────┬──────┐ │ │ 放大1/2倍 │ 放大1倍 │ 放大2倍 │ ├──────┼──────┼──────┼──────┤ │方式一 │ 8.0-63.7 │ 8.0-63.7 │ 8.2- 63.7 │ │方式一改良版│ 8.0-28.3 │ 8.0-28.7 │ 8.1- 29.1 │ │方式二 │ 28.3-30.5 │ 55.8-60.2 │110.7-119.6 │ │方式二改良版│ 6.9- 9.1 │ 12.8-17.3 │ 24.8- 33.6 │ └──────┴──────┴──────┴──────┘ 由上表可約略估出,當兩種方式均未改良時(使用同樣的對映計算),約 在縮小1.6倍時平均情況達到平衡(與原先之數理分析結果差不多)。而當方式 二改良後,由於對映計算的部份加快很多,因此若方式一仍未改良,則變成約 在放大2.5倍時達到平衡。若方式一亦加以改良,則約在放大1.2倍時達到平衡。 然而為了計算方便,我們可綜合為方式二改良後,當使用組合語言改良方式一 之對映計算時,應在放大1倍以上才以原始影像為主計算;而當不使用組合語言 改良時,則在放大2倍以上時才以原始影像為主計算。 上面所說的均局限於影像水平方向的縮放而已,至於垂直方向縮放,則大 都直接由目的影像為主進行計算,只不過在計算時偵測是否與前一個目的影像 行對映至相同的原始影像行。若是,則直接拷貝前一個目的影像行資料便可以 了,不必再重新產生新的目的影像行。 -- 青衫詩客 - 小邱. > -------------------------------------------------------------------------- < 發信人: zosterops@bbs.ee.ntu.edu.tw (瞇著眼睛的鳥), 看板: Programming 標 題: Re: 請問改變圖形檔大小的演算法? 發信站: 台大電機 Maxwell BBS (Thu Dec 31 22:25:51 1998) 轉信站: Ptt!news.ntu!bbs.ee.ntu!Maxwell ※ 引述《jgjsbee.bbs@bbs.cs.nthu.edu.tw (我怕熱訊)》之銘言: : ※ 引述《futuredragon.bbs@cszone.cc.ntu.edu.tw (futuredragon)》之銘言: : > 哪麼請問怎樣才能任意比例縮放呢? : > 我看線代課本上有圖形解析度的問題, : > 請問有沒有關係呢? : 任意縮放: : 這要倒著算才行. : 例如 I0 = 原始影像 : I3 = 長寬皆為原來 1/3 的影像 : 今欲得 I3(x,y) 之 pixel value ,可知 : I3(x,y)=I0(3*x, 3*y) , 設 u=3*x , v=3*y : 若 u , v 為整數(格子點,即本例),沒問題,直接把 I0(u,v) 填到 I3(x,y) 即可. : 若 u,v 非整數(如 In, n非整數), 那麼可由附近的格子點內插得 pixel value. 看你圖型的種類,適合的方法都不同 一般的圖型可以用 bi-linear/bi-cubic,FFT類的處理有時還可以更快 -- ※ Origin: 臺大電機 Maxwell 站 ◆ From: corsair.ee.ntu.edu.tw