==> 於 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