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

對JPEG圖檔作旋轉動作

尚未結案
hillel5021
一般會員


發表:5
回覆:11
積分:3
註冊:2003-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-13 23:37:30 IP:61.58.xxx.xxx 未訂閱
請問有沒有前輩用Delphi做過將JPEG的圖作旋轉的動作,我查過之前文章,都是用BCB做的,而且好像都只能針對BMP的圖檔作旋轉動作,請問有沒有前輩能交教我如何對JPEG圖檔作旋轉動作,非常感激,謝謝
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-13 23:48:19 IP:140.135.xxx.xxx 未訂閱
hillel5021您好:      我不會Delphi,不過我告訴您最關鍵的地方...   因為沒有辦法直接讀取JPEG圖檔座標位置上的RGB值   所以您必須先將您的TJPEG assign 給TBitmap,再做旋轉的動作   至於程式的部分就請高手來回答您吧< > 順心< > ~我也是在學習的階段,所以請您多多見諒與指教~
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-14 23:52:39 IP:61.221.xxx.xxx 未訂閱
引言: 請問有沒有前輩用Delphi做過將JPEG的圖作旋轉的動作,我查過之前文章,都是用BCB做的,而且好像都只能針對BMP的圖檔作旋轉動作,請問有沒有前輩能交教我如何對JPEG圖檔作旋轉動作,非常感激,謝謝
hillel5021 你好:
(1)如 taishyang 所說,應該是沒有辦法直接對 JPEG 做旋轉的動作,因 JPEG
   是將 Bitmap 做壓縮、編碼所得到的結果,也因此沒有辦法直接得到原本每
   一點的 RGB 值
(2)所以,應該是要先把 JPEG 轉成 Bitmap,然後做旋轉的運算,等到運算完成
   以後,再把運算完成的結果,轉回 JPEG (如果有必要的話)
(3)有關 JPEG 與 Bitmap 之間的互轉,你可以善加利用本站的搜尋功能,就可
   以找到很多這方面的相關文章
(4)至於旋轉的做法有滿多的,也因為功能上的不同 (例如: 旋轉角度的限制),
   形成的難易度也有差別,詳細的做法,請參考以下的連結文章
   http://www.fastgraph.com/help/rotate_delphi.html
   http://www.nsonic.de/Delphi/txt_WIS00263.htm
-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
hillel5021
一般會員


發表:5
回覆:11
積分:3
註冊:2003-05-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-15 01:06:25 IP:61.58.xxx.xxx 未訂閱
謝謝各位前輩的解答,我仍在努力試驗中,有結果再告知各位前輩吧,謝謝各位的幫忙,謝謝
hillel5021
一般會員


發表:5
回覆:11
積分:3
註冊:2003-05-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-15 10:40:37 IP:61.58.xxx.xxx 未訂閱
msstream:=TMemoryStream.Create ; Image1.Picture.Graphic.SaveToStream(msstream); Jpeg1 :=TJpegImage.Create; Jpeg1.LoadFromStream(msstream); bmp1 :=TBitmap.Create; bmp1.Assign(Jpeg1); 請問前輩,上面程式中,為什麼執行到Jpeg1.LoadFromStream(msstream);時 ,就會出現'Illegal Character in input file ($A140)' 的錯誤訊息阿,我有uses jpeg ,也有宣告Jpeg1:TJpegImage了阿 ,請前輩幫我看看好嗎,謝謝
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-15 10:46:03 IP:202.39.xxx.xxx 未訂閱
 Jpeg1.LoadFromStream(msstream); // 這行程式碼最前面有個全形空白
 bmp1 :=TBitmap.Create; // 這行也有
 bmp1.Assign(Jpeg1); // 這行也有
把那些全形空白刪除即可 --- --<-<-<@
hillel5021
一般會員


發表:5
回覆:11
積分:3
註冊:2003-05-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-16 01:55:45 IP:61.58.xxx.xxx 未訂閱
謝謝各位前輩的指導與幫助,我終於試出了如何將jpeg圖旋轉的程式了,我貼在下面,以供之後有人可以作為參考.再此謝謝之前給過我指示的前輩,謝謝 taishyang , RaynorPao , hagar前輩的指導,真的非常謝謝 var x,y:Integer; Jpeg1:TJpegImage; bmp1,tmpbmp:TBitmap; begin Jpeg1 :=TJpegImage.Create; Jpeg1.LoadFromFile('c:\test.jpg'); DeleteFile('c:\test.jpg'); bmp1 :=TBitmap.Create; bmp1.Assign(Jpeg1); tmpbmp:=TBitmap.Create; tmpbmp.Width:=bmp1.Height; tmpbmp.Height:=bmp1.Width; for x:=0 to bmp1.Width do for y:=0 to bmp1.Height do tmpbmp.Canvas.Pixels[y,bmp1.Width-1-x]:=bmp1.Canvas.Pixels[x,y]; Image1.Picture.Bitmap:=tmpbmp; Jpeg1.Assign(tmpbmp); Jpeg1.SaveToFile('c:\test.jpg'); Jpeg1.Free; bmp1.Free; tmpbmp.Free; end; 對了,再此再問一個問題喔,我這程式處理一個257K的圖片旋轉,需要20秒,算是正常嗎?還是有更快的演算方法呢? 發表人 - hillel5021 於 2003/07/16 01:57:24
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-16 23:15:32 IP:61.221.xxx.xxx 未訂閱
引言: 謝謝各位前輩的指導與幫助,我終於試出了如何將jpeg圖旋轉的程式了,我貼在下面,以供之後有人可以作為參考.再此謝謝之前給過我指示的前輩,謝謝 taishyang , RaynorPao , hagar前輩的指導,真的非常謝謝 var x,y:Integer; Jpeg1:TJpegImage; bmp1,tmpbmp:TBitmap; begin Jpeg1 :=TJpegImage.Create; Jpeg1.LoadFromFile('c:\test.jpg'); DeleteFile('c:\test.jpg'); bmp1 :=TBitmap.Create; bmp1.Assign(Jpeg1); tmpbmp:=TBitmap.Create; tmpbmp.Width:=bmp1.Height; tmpbmp.Height:=bmp1.Width; for x:=0 to bmp1.Width do for y:=0 to bmp1.Height do tmpbmp.Canvas.Pixels[y,bmp1.Width-1-x]:=bmp1.Canvas.Pixels[x,y]; Image1.Picture.Bitmap:=tmpbmp; Jpeg1.Assign(tmpbmp); Jpeg1.SaveToFile('c:\test.jpg'); Jpeg1.Free; bmp1.Free; tmpbmp.Free; end; 對了,再此再問一個問題喔,我這程式處理一個257K的圖片旋轉,需要20秒,算是正常嗎?還是有更快的演算方法呢?
hillel5021 你好:
(1)非常感謝你的熱心分享
( >
    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
Rain
資深會員


發表:31
回覆:236
積分:268
註冊:2003-02-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-17 10:32:56 IP:218.5.xxx.xxx 未訂閱
使用 ScanLine要比Pixels快不少,在網路上找了一段用ScanLine處理旋轉的代碼,測試了一下,整個過程要比你原來的快4倍左右,可參考看看:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, W:Integer;
  bmp1, tmpbmp: TBitmap;
  Jpeg1: TJpegImage;
  t: DWord;
  ScOrg, ScDest: array of PIntegerArray;
begin
  //t := GetTickCount;
  Jpeg1 :=TJpegImage.Create;
  bmp1 := TBitmap.Create;
  tmpbmp:= TBitmap.Create;
  try
    Jpeg1.LoadFromFile('c:\test.jpg');
    DeleteFile('c:\test.jpg');
    bmp1.Assign(Jpeg1);
    bmp1.PixelFormat := pf32bit;
    tmpbmp.Assign(bmp1);
    W := bmp1.Width;
    bmp1.Width := bmp1.Height;
    bmp1.Height := W;
    Dec(W);
    SetLength(ScDest, bmp1.Height);
    SetLength(ScOrg, tmpbmp.Height);
    for i:=0 to bmp1.Height-1 do ScDest[i] := bmp1.ScanLine[i];
    for i:=0 to tmpbmp.Height-1 do ScOrg[i] := tmpbmp.ScanLine[i];
    for i:=0 to bmp1.Height-1 do
      for j:=0 to bmp1.Width-1 do
        ScDest[W-i][j] := ScOrg[j][i];
    Image1.Picture.Bitmap := bmp1;
    Jpeg1.Assign(bmp1);
    Jpeg1.SaveToFile('c:\test.jpg');
    //ShowMessageFmt('%d', [GetTickCount - t]);
  finally
    tmpbmp.Free;
    bmp1.Free;
    Jpeg1.Free;
  end;
end;    
另外實現任意角度的旋轉可參考這裏: http://www.delphibbs.com/delphibbs/dispq.asp?lid=875885 發表人 - Rain 於 2003/07/17 10:38:46
hillel5021
一般會員


發表:5
回覆:11
積分:3
註冊:2003-05-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-17 13:29:30 IP:61.58.xxx.xxx 未訂閱
真的快非常多耶 謝謝謝謝 非常謝謝 謝謝各位前輩肯大力幫助 非常感激中 謝謝
系統時間:2024-03-29 1:31:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!