請問Delphi是否有將Bitmap轉JPEG的更好方法 |
答題得分者是:bugmans
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
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 發送簡訊給我 |
|
johnnywww
一般會員 發表:0 回覆:1 積分:0 註冊:2004-06-07 發送簡訊給我 |
我用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 發送簡訊給我 |
感謝你的回覆,但我截取後存檔,圖片呈網格狀,而且不正確.會不會是顏色位元數沒設定好(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] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |