線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3766
推到 Plurk!
推到 Facebook!

請問Delphi是否有將Bitmap轉JPEG的更好方法

答題得分者是:bugmans
17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-04-25 15:59:00 IP:60.250.xxx.xxx 訂閱
一般是使用uses jpeg,Delphi內鍵的JPEG函數,但是使用此函數每一次轉換都要耗費8%的CPU,是否還有它更快的方法來使用。
我是有上網看到iJL(intel JPEG Library)但此函式庫是用C 來寫的,Delphi有方法可以拿來使用嗎。
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-04-25 18:42:52 IP:58.61.xxx.xxx 未訂閱
到这里找吧:
http://www.torry.net/pages.php?s=72
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-04-27 10:28:35 IP:125.225.xxx.xxx 未訂閱
pasjpg10.zip
JPEG library Based on the Independent JPEG Group's free JPEG library rev 6a
Independent JPEG Group 的免費 JPEG 函式庫 rev 6a 之 Pascal 版本.
http://delphi.ktop.com.tw/board.php?cid=161&fid=110&tid=5142


但JPEG編碼時就要好幾個步驟,不認為用這個能再快多少
http://zh.wikipedia.org/wiki/JPEG#.E7.B7.A8.E7.A2.BC
17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-04-28 10:09:25 IP:60.250.xxx.xxx 訂閱
是看到ijl好像有用到intel 指令來增加JPEG編碼效率
johnnywww
一般會員


發表:0
回覆:1
積分:0
註冊:2004-06-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-06-25 18:07:25 IP:61.141.xxx.xxx 訂閱
我用Intel Jpeg library ijl15.dll,相關pas檔參見http://www.koders.com/delphi/fid53305CCCB04404DF6E7857E664B576C2006DF6BE.aspx,代碼如下:

[code delphi]
procedure TAppTools.SaveIntelJpegFile(const ABitmap: TBitmap; const AFileName:
string; const AQuality: Integer);
var
PBitmapBits: Pointer;
PBitmapHeadInfo: PBitmapInfo;
InfoSize, ImageSize: DWORD;
PJpeg: Pointer;
psrc: Pointer;
bWidth, bHeight: Integer;
bps: Integer;
i: Integer;
LineBytes: Integer;
pLine: Pointer;
jcprops: TJPEG_CORE_PROPERTIES;
begin
if (ijlInit(@jcprops) <> IJL_OK) then
Exit;
PBitmapBits := nil;
PBitmapHeadInfo := nil;
PJpeg := nil;
try
GetDIBSizes(ABitmap.Handle, InfoSize, ImageSize);
PBitmapBits := AllocMem(ImageSize);
PBitmapHeadInfo := AllocMem(InfoSize);
if not GetDIB(ABitmap.Handle, 0, PBitmapHeadInfo^, PBitmapBits^) then
begin
Exit;
end;
jcprops.JPGFile := PChar(AFileName);
jcprops.jquality := AQuality;
bWidth := ABitmap.Width;
bHeight := ABitmap.Height;
jcprops.DIBWidth := bWidth;
jcprops.DIBHeight := bHeight;
jcprops.JPGWidth := bWidth;
jcprops.JPGHeight := bHeight;
// 将Bitmap Bits数据转为Jpeg数据,如果直接用Bitmap
//Bits数据,那么保存的jpeg文件为反转的
GetMem(PJpeg, bWidth * bHeight * 3);
jcprops.DIBBytes := PJpeg;
bps := (bWidth * 3 3) div 4 * 4;
psrc := Pointer(Integer(PBitmapBits) bHeight * bps);
pline := PJpeg;
LineBytes := bWidth * 3;
for i := bHeight - 1 downto 0 do
begin
psrc := pointer(Integer(psrc) - bps);
CopyMemory(pline, psrc, LineBytes);
pline := Pointer(Integer(pline) LineBytes);
end;

if (ijlWrite(@jcprops, IJL_JFILE_WRITEWHOLEIMAGE) <> IJL_OK) then
begin
WriteLog('ijl write error');
end;
finally
FreeMem(PBitmapBits, ImageSize);
FreeMem(PBitmapHeadInfo, infosize);
FreeMem(PJpeg, bWidth * bHeight * 3);
end;

end;

[/code]
編輯記錄
johnnywww 重新編輯於 2008-06-25 18:15:36, 註解 無‧
17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-07-23 15:27:20 IP:60.250.xxx.xxx 訂閱
感謝你的回覆,但我截取後存檔,圖片呈網格狀,而且不正確.會不會是顏色位元數沒設定好(ex : pf32bit)

[code delphi]
procedure GetScreenShot(ABitmap: TBitmap);
var
dc0: HDC;
begin
if not Assigned(ABitmap) then
begin
raise Exception.Create('GetScreenShot: Bitmap not assigned.');
Exit;
end;
dc0 := GetDC(0);
try
BitBlt(ABitmap.Canvas.Handle,0,0,ABitmap.Width,ABitmap.Height,dc0,0,0,SRCCOPY);
finally
ReleaseDC(0, dc0);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
TheNewScrBmp : TBitMap;
begin
TheNewScrBmp := TBitMap.Create; //存目前的螢幕的畫面
TheNewScrBmp.Width := Screen.Width;
TheNewScrBmp.Height := Screen.Height;
GetScreenShot(TheNewScrBmp);
SaveIntelJpegFile(TheNewScrBmp,'c:/1.jpg',80);
TheNewScrBmp.free;
end;

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