qalin
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:20 回覆:45 積分:13 註冊:2003-07-18
發送簡訊給我
|
我看了BCB的BMP無損調整,但我對BCB不熟悉,現在我想在DELPHI下實現圖片的無損放大,不知哪位高人可以賜教?或者是不可能實現?
|
Fishman
尊榮會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](http://delphi.ktop.com.tw/download.php?download=upload/4625e86775ae1_TeddyBear.gif) 發表:120 回覆:1949 積分:2163 註冊:2006-10-28
發送簡訊給我
|
|
qalin
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:20 回覆:45 積分:13 註冊:2003-07-18
發送簡訊給我
|
老兄,我說的是無損放大,我按以上提供的辦法去做,放大後都是馬賽克,可能是我對“無損”的概念理解錯了?但總之我指的是放大後沒有馬賽克的才行。
|
taishyang
站務副站長
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](http://delphi.ktop.com.tw/download.php?download=upload/462c1ab02cd1c_Pic.jpg) 發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
qalin您好:
我不是高人,但我想[無失真放大]肯定是不可能的,倘若可以的話
那做伸縮鏡頭的廠商都不用玩了 ![]() <>~我也是在學習的階段,回答的不好請您多多見諒與指教~>
|
qalin
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:20 回覆:45 積分:13 註冊:2003-07-18
發送簡訊給我
|
是呀,我也這麽想,比方說下面的演算法就肯定不是我想要的了:
if i>0 then
begin
image.Width:=jpgw*i ;
image.Height:=jpgh*i ;
end;
從光學變焦的原理看,我確實想不出可以用軟體來代替的方法,在這裏討教是希望有出乎意料的收穫,不知還有沒更好的提示?
在這裏先謝謝Fishman和taishyang大大的提示:)
|
taishyang
站務副站長
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](http://delphi.ktop.com.tw/download.php?download=upload/462c1ab02cd1c_Pic.jpg) 發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
|
qalin
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:20 回覆:45 積分:13 註冊:2003-07-18
發送簡訊給我
|
非常感謝taishyang大蝦!
我對比了一下上面兩篇文章,覺得JerryKuo大蝦的更接近我這次的要求。可惜我沒裝BCB,看不到CODE……
|
qalin
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:20 回覆:45 積分:13 註冊:2003-07-18
發送簡訊給我
|
我正在轉換。
可我怎麽這麽菜呀,連extended->integer和extended->byte的轉換都不會……
|
bruce0211
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:157 回覆:668 積分:279 註冊:2002-06-13
發送簡訊給我
|
引言:
我正在轉換。
可我怎麽這麽菜呀,連extended->integer和extended->byte的轉換都不會……
>>< face="Verdana, Arial, Helvetica"> 我剛改寫好 Delphi 版測試程式,請參考
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34732
//------------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var jpg: TJPEGImage;
bmp1,bmp2: TBitmap;
w,h,newW,newH: integer;
dX,dY,x,y: double;
i,j: integer;
ix,iy: integer; // integer value of (x,y)
fx,fy: double; // float value of (x,y)
clr,
clrR,clrG,clrB,
nclr1,nclr2,nclr3,nclr4: Byte; // color of neighbor 4 pixel
begin if (not batch) then
begin
if (not OpenDialog1.Execute) then
begin
exit;
end;
end; jpg :=TJPEGImage.Create;
bmp1:=TBitmap.Create;
bmp2:=TBitmap.Create; //將轉換前的 jpg 檔 Assign 到 bmp1 物件
jpg.LoadFromFile(OpenDialog1.FileName);
bmp1.Assign(jpg); //欲改變的 Size
bmp2.Width:=640;
bmp2.Height:=480; //透過 JerryKuo 長官內插法轉換 Size (bmp1 -> bmp2)==========
w := bmp1.Width;
h := bmp1.Height;
newW := 640;
newH := 480; bmp2.Width := newW;
bmp2.Height := newH; (* Caculate the step size of movement *)
dX := w/newW ; //bcb 語法: (double)w/(double)newW;
dY := h/newH ; //bcb 語法: (double)h/(double)newH; for j := 0 to (newH - 1) do
for i := 0 to (newW -1) do
begin
x := dX*i;
y := dY*j; ix := Trunc(x); iy := Trunc(y); //ix = (int)x; iy = (int)y;
fx := x - ix; fy := y - iy; //fx = x - (float)ix; fy = y - (float)iy; nclr1 := GetRValue(bmp1.Canvas.Pixels[ix,iy]);
nclr2 := GetRValue(bmp1.Canvas.Pixels[ix 1,iy]);
nclr3 := GetRValue(bmp1.Canvas.Pixels[ix,iy 1]);
nclr4 := GetRValue(bmp1.Canvas.Pixels[ix 1,iy 1]);
// Bilinear
clrR:=byte(Trunc( ((1.0-fx)*(1.0-fy)*nclr1 (fx)*(1.0-fy)*nclr2
(1.0-fx)* (fy)*nclr3 (fx)* (fy)*nclr4)
) ); nclr1 := GetGValue(bmp1.Canvas.Pixels[ix,iy]);
nclr2 := GetGValue(bmp1.Canvas.Pixels[ix 1,iy]);
nclr3 := GetGValue(bmp1.Canvas.Pixels[ix,iy 1]);
nclr4 := GetGValue(bmp1.Canvas.Pixels[ix 1,iy 1]);
// Bilinear
clrG:=byte(Trunc( ((1.0-fx)*(1.0-fy)*nclr1 (fx)*(1.0-fy)*nclr2
(1.0-fx)* (fy)*nclr3 (fx)* (fy)*nclr4)
) ); nclr1 := GetBValue(bmp1.Canvas.Pixels[ix,iy]);
nclr2 := GetBValue(bmp1.Canvas.Pixels[ix 1,iy]);
nclr3 := GetBValue(bmp1.Canvas.Pixels[ix,iy 1]);
nclr4 := GetBValue(bmp1.Canvas.Pixels[ix 1,iy 1]);
// Bilinear
clrB:=byte(Trunc( ((1.0-fx)*(1.0-fy)*nclr1 (fx)*(1.0-fy)*nclr2
(1.0-fx)* (fy)*nclr3 (fx)* (fy)*nclr4)
) ); bmp2.Canvas.Pixels[i,j] := TColor(RGB(clrR,clrG,clrB));
end;
//========================================================== //將轉換後的 Size Assign 到 jpg 物件
jpg.Assign(bmp2); jpg.SaveToFile('c:\2.jpg');
if (not batch) then ShellExecute(0,nil,'c:\2.jpg',nil,nil,SW_SHOWMAXIMIZED); jpg.Free;
bmp1.Free;
bmp2.Free;
end;
|
qalin
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:20 回覆:45 積分:13 註冊:2003-07-18
發送簡訊給我
|
bruce0211大蝦您好!非常感謝您的支援!
我花了九牛二虎之力終於也轉化出來了,可跟您的對比了一下,發現“ix:=Trunc(x);iy:=Trunc(y);”這行還是沒有您的簡潔,呵呵俺的基礎太菜了,得多花時間惡補一下。不過做出來的效果還真不錯,看不見馬賽克。
|
bruce0211
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:157 回覆:668 積分:279 註冊:2002-06-13
發送簡訊給我
|
引言:
bruce0211大蝦您好!非常感謝您的支援!
我花了九牛二虎之力終於也轉化出來了,可跟您的對比了一下,發現“ix:=Trunc(x);iy:=Trunc(y);”這行還是沒有您的簡潔,呵呵俺的基礎太菜了,得多花時間惡補一下。不過做出來的效果還真不錯,看不見馬賽克。
>>< face="Verdana, Arial, Helvetica">
長官
效果還真不錯要多比較幾張照片才能分曉
請參考下文
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=43205
我目前認為平滑法更好....
|
qalin
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:20 回覆:45 積分:13 註冊:2003-07-18
發送簡訊給我
|
bruce0211大蝦您好!
您只比較了縮小,卻沒有比較放大,我認爲內插法的優勢在於放大,這正是我需要的,而且在放大2倍時效果真的很不錯。您比較一下下面看看就知道我說的不假 ![]()
原圖< />
< src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=13562929&CC=303331">
內插法 1
![](http://delphi.ktop.com.tw/loadfile.php?TOPICID=13562303&CC=303317) 內插法 2
![](http://delphi.ktop.com.tw/loadfile.php?TOPICID=13562616&CC=303324) 平滑法
API法
|