[請益]灰階Image元件(pf8bit),以TJPEGImage降低影像品質後(例如40),再灌回 |
尚未結案
|
alen
一般會員 發表:3 回覆:6 積分:1 註冊:2004-03-19 發送簡訊給我 |
[請益]灰階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 發送簡訊給我 |
[問題補充 ]
自幾己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 發送簡訊給我 |
程式目的
將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
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |