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

為什麼jpg檔會變成0K

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-09 23:23:16 IP:61.230.xxx.xxx 訂閱
<textarea class="delphi" rows="10" cols="60" name="code"> Jpg := TJpegImage.Create; mycanvas:=TCanvas.Create; mybitmap:=tbitmap.Create; dc:=getdc(0); try myCanvas.Handle := DC; with Screen do begin MyBitmap.Width := Width; MyBitmap.Height := Height; MyBitmap.Canvas.CopyRect(Rect(0,0,Width,Height),myCanvas,Rect(0,0,Width,Height)); image1.Picture.Bitmap.Assign(mybitmap); MyBitmap.SaveToFile(inttostr(picindex) '.Bmp'); //jpg.scale:=jsfullsize; Jpg.Assign(mybitmap); Jpg.Performance:=jpBestQuality; Jpg.pixelformat:=jf24bit; Jpg.CompressionQuality := 30; //你想要的壓縮品質 Jpg.Compress; //<-* Jpg.SaveToFile(inttostr(picindex) '.jpg'); end; </textarea> 我改成 Jpg.pixelformat:=jf8bit;就存成0bit蠻奇怪的,好像參數不行的感覺
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-10 08:36:04 IP:61.220.xxx.xxx 訂閱
實際測試, 來源必須是 8 bit ( 256 色) 圖片 or 畫面才能用該參數

<textarea class="delphi" rows="10" cols="60" name="code">procedure TForm1.FormCreate(Sender: TObject); var Jpg : TJPEGImage; mycanvas : TCanvas; mybitmap : TBitmap; dc : HDC; i:Integer; begin Jpg := TJpegImage.Create; mycanvas:=TCanvas.Create; mybitmap:=tbitmap.Create; dc:=getdc(0); try myCanvas.Handle := DC; with Screen do i:=0; begin MyBitmap.Width := Width; MyBitmap.Height := Height; MyBitmap.Canvas.CopyRect(Rect(0,0,Width,Height),myCanvas,Rect(0,0,Width,Height)); image1.Picture.Bitmap.Assign(mybitmap); // MyBitmap.SaveToFile(inttostr(picindex) '.Bmp'); // MyBitmap.SaveToFile('C:\' IntToStr(i) '.Bmp'); MyBitmap.SaveToFile('C:\256.Bmp'); // 8 bit color //jpg.scale:=jsfullsize; Jpg.Assign(mybitmap); Jpg.Performance:=jpBestQuality; // Jpg.pixelformat:=jf24bit; Jpg.pixelformat:=jf8bit; Jpg.CompressionQuality := 30; //你想要的壓縮品質 Jpg.Compress; //<-* // Jpg.SaveToFile(inttostr(picindex) '.jpg'); Jpg.SaveToFile('C:\' IntToStr(i) '.jpg'); i:=i 1; end; Finally end; end;</textarea>
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
17kobe
初階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-09-10 09:24:18 IP:60.250.xxx.xxx 訂閱
<textarea class="delphi" rows="10" cols="60" name="code"> application.Minimize; application.ProcessMessages; //可能要delay一下,不然抓到空白東東 Jpg := TJpegImage.Create; mycanvas:=TCanvas.Create; mybitmap:=tbitmap.Create; dc:=getdc(0); try myCanvas.Handle := DC; with Screen do begin MyBitmap.Width := Width; MyBitmap.Height := Height; MyBitmap.Canvas.CopyRect(Rect(0,0,Width,Height),myCanvas,Rect(0,0,Width,Height)); MyBitmap.pixelformat:=pf8bit; image1.Picture.Bitmap.Assign(mybitmap); MyBitmap.SaveToFile(inttostr(picindex) '.Bmp'); Jpg.Assign(mybitmap); Jpg.pixelformat:=jf8bit; Jpg.Performance:=jpBestQuality; Jpg.CompressionQuality := 30; //你想要的壓縮品質 Jpg.Compress; //<-* Jpg.SaveToFile(inttostr(picindex) '.jpg'); end; </textarea> 再請問一下,前面參數要如何來改才能有256色,我改這樣,結果後面有加Jpg.pixelformat:=jf8bit;這一行就存成0k,若沒加這一行結果跑可以,但是存的大小都差不多。好像聽說jpg都是用16bit來存不知道怎麼樣來改才對。
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-09-10 10:13:20 IP:61.220.xxx.xxx 訂閱
我的測試錯了
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
hagar
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-09-10 19:11:48 IP:220.137.xxx.xxx 未訂閱
把  Jpg.pixelformat := jf8bit; 這行放在 Jpg.Assign(mybitmap); 這行的前面試試
17kobe
初階會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-09-10 19:34:39 IP:61.230.xxx.xxx 訂閱
如果加在前面好像 有加跟沒加是一樣的,而且大小都不變,我最主要想要用256色表示,且檔案能縮小。
hagar
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-09-10 19:57:02 IP:220.137.xxx.xxx 未訂閱
那就奇怪了
小弟試的結果是 jpg 檔的 Size 不會是 0
而且更改 Jpg.CompressionQuality, 所存的 jpg 的大小也會不同

另外, 您可以參考這篇討論:
http://groups.google.com.tw/group/borland.public.delphi.graphics/browse_thread/thread/cc4b9df6d41fa29/7988a069eeb33346?lnk=st&q=delphi jf8bit filesize&rnum=1&hl=zh-TW#7988a069eeb33346
17kobe
初階會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-09-10 21:11:14 IP:61.230.xxx.xxx 訂閱
嗯 看得是如此,只有顯示時用的而已,實際上並不能做存檔。檔案還是偏大,反而不如用一些基本演算法而壓,用TCompressionStream可壓到20K~50K,不知還有沒有可以壓到甚至有個位數k的壓縮法。
編輯記錄
17kobe 重新編輯於 2007-09-11 09:13:52, 註解 無‧
hagar
版主


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-09-11 06:44:49 IP:123.192.xxx.xxx 未訂閱
參考 TJpegImage.PixelFormat 的 Help
它是用來決定 TJpegImage 在 Display 時是用 24-Bit 或 8-Bit Format
不是用來決定 存/寫 檔時的 Format
系統時間:2024-05-09 3:35:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!