全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4053
推到 Plurk!
推到 Facebook!

如何實現圖片的無損放大?

尚未結案
qalin
一般會員


發表:20
回覆:45
積分:13
註冊:2003-07-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-02 15:53:27 IP:61.177.xxx.xxx 未訂閱
我看了BCB的BMP無損調整,但我對BCB不熟悉,現在我想在DELPHI下實現圖片的無損放大,不知哪位高人可以賜教?或者是不可能實現?
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-02 17:03:03 IP:210.65.xxx.xxx 未訂閱
Hi:    拜讀 sos_admin 大作,你就可以得到答案 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38057 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
qalin
一般會員


發表:20
回覆:45
積分:13
註冊:2003-07-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-02 18:54:28 IP:61.177.xxx.xxx 未訂閱
老兄,我說的是無損放大,我按以上提供的辦法去做,放大後都是馬賽克,可能是我對“無損”的概念理解錯了?但總之我指的是放大後沒有馬賽克的才行。
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-02 19:46:45 IP:140.135.xxx.xxx 未訂閱
qalin您好: 我不是高人,但我想[無失真放大]肯定是不可能的,倘若可以的話 那做伸縮鏡頭的廠商都不用玩了 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
qalin
一般會員


發表:20
回覆:45
積分:13
註冊:2003-07-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-02 20:32:42 IP:218.90.xxx.xxx 未訂閱
是呀,我也這麽想,比方說下面的演算法就肯定不是我想要的了: if i>0 then begin image.Width:=jpgw*i ; image.Height:=jpgh*i ; end; 從光學變焦的原理看,我確實想不出可以用軟體來代替的方法,在這裏討教是希望有出乎意料的收穫,不知還有沒更好的提示? 在這裏先謝謝Fishman和taishyang大大的提示:)
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-02 20:45:40 IP:140.135.xxx.xxx 未訂閱
qalin您好: 因為無法做到[無失真放大],所以有很多人做這方面的論文研究 而天使站長有這方面的作品分享您可以參考看看 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=23589 【分享】圖形縮小(放大)演算法兩個 以及JerryKuo版主的作品(BCB) http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34732 【發表】影像處理-內插法應用於圖片縮放 順心
qalin
一般會員


發表:20
回覆:45
積分:13
註冊:2003-07-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-02 21:48:29 IP:218.90.xxx.xxx 未訂閱
非常感謝taishyang大蝦! 我對比了一下上面兩篇文章,覺得JerryKuo大蝦的更接近我這次的要求。可惜我沒裝BCB,看不到CODE……
qalin
一般會員


發表:20
回覆:45
積分:13
註冊:2003-07-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-03 08:05:45 IP:218.90.xxx.xxx 未訂閱
我正在轉換。 可我怎麽這麽菜呀,連extended->integer和extended->byte的轉換都不會……
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-06 17:02:29 IP:211.21.xxx.xxx 未訂閱
引言: 我正在轉換。 可我怎麽這麽菜呀,連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
一般會員


發表:20
回覆:45
積分:13
註冊:2003-07-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-01-07 10:34:25 IP:218.90.xxx.xxx 未訂閱
bruce0211大蝦您好!非常感謝您的支援! 我花了九牛二虎之力終於也轉化出來了,可跟您的對比了一下,發現“ix:=Trunc(x);iy:=Trunc(y);”這行還是沒有您的簡潔,呵呵俺的基礎太菜了,得多花時間惡補一下。不過做出來的效果還真不錯,看不見馬賽克。
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-01-08 18:26:06 IP:211.21.xxx.xxx 未訂閱
引言: bruce0211大蝦您好!非常感謝您的支援! 我花了九牛二虎之力終於也轉化出來了,可跟您的對比了一下,發現“ix:=Trunc(x);iy:=Trunc(y);”這行還是沒有您的簡潔,呵呵俺的基礎太菜了,得多花時間惡補一下。不過做出來的效果還真不錯,看不見馬賽克。 < face="Verdana, Arial, Helvetica"> 長官 效果還真不錯要多比較幾張照片才能分曉 請參考下文 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=43205 我目前認為平滑法更好....
qalin
一般會員


發表:20
回覆:45
積分:13
註冊:2003-07-18

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-01-08 19:19:21 IP:218.90.xxx.xxx 未訂閱
bruce0211大蝦您好! 您只比較了縮小,卻沒有比較放大,我認爲內插法的優勢在於放大,這正是我需要的,而且在放大2倍時效果真的很不錯。您比較一下下面看看就知道我說的不假 原圖< /> < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=13562929&CC=303331">
內插法 1

內插法 2

平滑法

API

系統時間:2024-05-08 12:30:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!