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

[請益]灰階Image元件(pf8bit),以TJPEGImage降低影像品質後(例如40),再灌回

尚未結案
alen
一般會員


發表:3
回覆:6
積分:1
註冊:2004-03-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-27 17:41:06 IP:218.162.xxx.xxx 未訂閱
[請益]灰階Image元件(pf8bit),以TJPEGImage降低影像品質後(例如40),再灌回Image元件 [前言] 我目前的浮水印研究進入最後測試階段,所有看的到的image元件全部是(pf8bit),因我只做灰階不作彩色, 因為需要作一連串JPEG[灰階喔]不同品質壓縮(例如 1~100),紀錄PSNR與NC值, 當然可以依序用 1.image元件 SaveToFile('Watermarked.bmp') 2.photoshop將'Watermarked.bmp' 轉換成'Watermarked.jpeg'用以降低品質 3.photoshop將'Watermarked.jpeg' 轉換成'Watermarked.bmp' 4.image元件 LoadFromFile('Watermarked.bmp') 以上試過1次影像psnr值與浮水印nc值正常且很滿意 有幾百種實驗這樣我會暈到 所以我打算用TJPEGImage解決bitmap->jpeg->bitmap 所以寫了以下程式碼 procedure JpegAtt; var jpg : TJPEGImage; begin jpg := TJPEGImage.Create; jpg.Grayscale := True; jpg.Assign(form1.imageWatermarked.Picture.Bitmap); //含有浮水印之灰階影像 jpg.CompressionQuality := 40; //調整壓縮品質 jpg.DIBNeeded; jpg.Compress; jpg.SaveToFile('test.jpg'); jpg.LoadFromFile('test.jpg'); jpg.PixelFormat := jf8Bit; jpg.Grayscale := True; form1.ImageJpegAttacked.Picture.Bitmap.Assign(jpg); //希望這是我要的經jpeg攻擊後之灰階影像,看起來像但不是灰階,懷疑調色盤有問題 Form1.ImageJpegAttacked.Picture.Bitmap.PixelFormat := pf8bit; form1.ImageAttacked.Refresh; FreeAndNil(jpg); end; //procedure JpegAtt [症狀] 借助photoshop工具作 (1).灰階bitmap 轉換 灰階JPEG (2).灰階JPEG 轉換 灰階bitmap [浮水印正常] 使用上面程式碼,看起來是像灰階,懷疑調色盤有問題 因為灰階像素運算均使用 PByteArray 並非彩色的PRGBTripleArray 但form1.ImageJpegAttacked.Picture.Bitmap.Assign(jpg)之後 PByteArray 取出 ImageJpegAttacked.Picture.Bitmap 不正常,浮水印一踏糊塗 懷疑調色盤有問題,也不知如何除錯起,在此要請教諸位先進賜教 Alen Hsu
alen
一般會員


發表:3
回覆:6
積分:1
註冊:2004-03-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-28 19:29:06 IP:218.162.xxx.xxx 未訂閱
[問題補充 ] 自幾己DIY努力一下,仍有瓶頸,麻煩前輩不吝賜教!!    //ImageWatermarked 為含有浮水印灰階影像 pf8bit //ImageAttacked 為將 ImageWatermarked 以 TJPEGImage 降低影像品質   以下程式設jpg.CompressionQuality := 100; //但是計算ImageAttacked與ImageWatermarked之PSNR值為 51.05,應該是無窮大才對 //也就是2張圖有些微不同(但很相似) //jpg.CompressionQuality := 100 ; 不是2張圖應該一樣嗎?    前輩有辦法讓2張圖一模一樣嗎?    Alen Hsu        procedure JpegAtt; var   jpg : TJPEGImage;   bmp : TBitmap; begin   //  ImageAttacked <- ImageWatermarked   Form1.ImageAttacked.Picture.Bitmap.Assign(     Form1.ImageWatermarked.Picture.Bitmap);   //  JPEGImage <- ImageAttacked   jpg := TJPEGImage.Create;   jpg.PixelFormat := jf8bit;   jpg.Grayscale := true;      jpg.CompressionQuality := 100;   jpg.Assign(form1.ImageAttacked.Picture.Bitmap);      jpg.DIBNeeded;   jpg.Compress;   jpg.SaveToFile('JpegAtt.jpg');   //  bmp <- JPEGImage   jpg.LoadFromFile('JpegAtt.jpg');   bmp := TBitMap.create;   //bmp.Assign(form1.Image8bit.Picture.Bitmap);   bmp.Assign(jpg);   // ImageAttacked <- bmp   form1.ImageAttacked.Canvas.Draw(0,0,bmp);   FreeAndNil(jpg);   FreeAndNil(bmp); end;  //procedure JpegAtt        51.05
alen
一般會員


發表:3
回覆:6
積分:1
註冊:2004-03-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-29 19:36:26 IP:218.162.xxx.xxx 未訂閱
程式目的  將ImageWatermarked(pf8bit)以TJPEGImage元件降低品質再秀在ImageAttacked(pf8bit)  特別要求:ImageWatermarked與ImageAttacked均必須一定要為(pf8bit)  問題已經解決,如下列程式    不滿意的地方  如果用for迴圈將JPEG向量品質由1做到100,則會有太多的檔案IO,效能不甚滿意  jpg.SaveToFile('JpegAtt.jpg');  jpg.LoadFromFile('JpegAtt.jpg');    再次請教如何使用 jpeg.SaveToStream 與 jpeg.LoadFromStream,以降低檔案IO                          Alen Hsu                              procedure JpegAtt; type   PRGBTripleArray = ^TRGBTripleArray;   TRGBTripleArray = array[0..32767] of TRGBTriple; var   jpg : TJPEGImage;   bmp : TBitmap;   x,y    : Integer;   P : PRGBTripleArray;   P2 : PByteArray; begin   //  ImageAttacked(pf8bit) <- ImageWatermarked(pf8bit)   Form1.ImageAttacked.Picture.Bitmap.Assign(     Form1.ImageWatermarked.Picture.Bitmap);   //  bmp彩色pf24bit <- ImageAttacked(pf8bit)   bmp := TBitMap.create;   bmp.Width:=256;   bmp.Height:=256;   bmp.PixelFormat := pf24bit;   for y := 0 to bmp.Height -1 do begin     P  := bmp.ScanLine[y];     P2 := Form1.ImageAttacked.Picture.Bitmap.ScanLine[y];     for x := 0 to bmp.Width -1 do begin       P[x].rgbtRed   := P2[x];       P[x].rgbtGreen := P2[x];       P[x].rgbtBlue  := P2[x];     end;  // for x   end;  // for y   //  JPEGImage(jf24bit) <- bmp彩色pf24bit   jpg := TJPEGImage.Create;   jpg.CompressionQuality := form1.JpegTrackBar.Position;   jpg.Assign(bmp);   FreeAndNil(bmp);   jpg.SaveToFile('JpegAtt.jpg');   //  bmp(pf24bit) <- JPEGImage(jf24bit)   jpg.LoadFromFile('JpegAtt.jpg');   //  ImageAttacked(pf8bit) <- bmp(pf24bit)   bmp := TBitMap.create;   bmp.Assign(jpg);   for y := 0 to bmp.Height -1 do begin     P  := bmp.ScanLine[y];     P2 := Form1.ImageAttacked.Picture.Bitmap.ScanLine[y];     for x := 0 to bmp.Width -1 do begin       P2[x] := P[x].rgbtGreen;     end;  // for x   end;  // for y   //Form1.ImageAttacked.Refresh;   FreeAndNil(jpg);   FreeAndNil(bmp); end;  //procedure JpegAtt
系統時間:2024-03-19 19:33:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!