小弟最近在做一個產品管理系統時遇到3個問題:
1:將一個 1000*800像素的JPG圖片通程序式按1/3壓縮后 出現大量的噪點 顯得很不協調,但是像畫圖等生成的縮小圖卻很平滑, 試驗過很多方法 仍然解決不了,附效果:
其他軟體效果:

自己生成效果:

鋸齒和噪點比較多,如何平滑?
2:delphi的影像控制元件好像對 CMYK模式的JPG圖片不怎么支持,一般需要轉化為RGB模式,現在想通程序式自動完成 如何操作?
3:皮膚控制元件的問題: 有點類似于用友資訊管理系統的批發效果,正常情況下 文本框就是一條橫線,獲得焦點后變成可編輯,組合框變成 一個小按鈕上面有幾個小點的那種,這種是什么皮膚控制元件?
這幾個問題實在比較困擾,望各位大神指點迷津,謝了~~~
uj5u.com熱心網友回復:
搜這個組件 Graphics32, 安裝上去后,看Graphics32\demo 這個目錄,你的啥問題都解決了uj5u.com熱心網友回復:
好的 我試試 多謝啦!
uj5u.com熱心網友回復:
gdi plusuj5u.com熱心網友回復:
C#下的GDI+試過 delphi下的能否給點建議?
uj5u.com熱心網友回復:
找到gdi+ for d的就行了,本壇maozefa寫的
另外,如果只是轉為外部檔案,也可以利用開源的第三方圖形庫/工具
如cximage,我的批量轉換工具就是d做界面,實際轉換呼叫cximage的命令列程式:
http://211.162.123.246:443/httpdisk/haitaosoft/?app=photolib
uj5u.com熱心網友回復:
你是用什么樣的演算法?uj5u.com熱心網友回復:
你是用什么樣的演算法?
函式如下:{'use graphics, jpeg
輸入參數為
FileName : 檔案的名稱連路徑
Width : 輸出濶度
Height : 輸出高度
Quality : 輸出JPEG質量 (0最差 - 100最好)
回傳參數為 TJpegImage 格式 (兼容 TGraphic)
}
function StretchImageSmall(FileName : TFileName; WHRate, Quality : Integer) : TJpegImage;
var
Height, Width :Integer;
bmp, tempbmp : TBitmap;
RT : TRect;
begin
try
if Uppercase(ExtractFileExt(FileName)) = '.JPG' then
begin
result := TjpegImage.Create;
result.LoadFromFile(FileName);
Height := Round(result.Height / WHRate*1.0);
Width := Round(result.Width / WHRate*1.0);
bmp := TBitmap.Create;
bmp.Width := Width;
bmp.Height := Height;
RT.Left := 0;
RT.Top := 0;
RT.Right := Width - 1;
RT.Bottom := Height - 1;
bmp.PixelFormat := pf24bit;
bmp.Canvas.StretchDraw(RT,result);
result.Assign(bmp);
result.CompressionQuality := Quality;
result.Compress;
end
else
exit;
finally
bmp.Free;
end;
end;
//觸發執行
Image1.Picture.Graphic := StretchImageSmall(ObjImgFilePath,3,100);
Image1.Picture.SaveToFile(IMGFilePath + '\123.jpg'); //生成縮略圖
uj5u.com熱心網友回復:
你是用什么樣的演算法?
函式如下:{'use graphics, jpeg
輸入參數為
FileName : 檔案的名稱連路徑
Width : 輸出濶度
Height : 輸出高度
Quality : 輸出JPEG質量 (0最差 - 100最好)
回傳參數為 TJpegImage 格式 (兼容 TGraphic)
}
function StretchImageSmall(FileName : TFileName; WHRate, Quality : Integer) : TJpegImage;
var
Height, Width :Integer;
bmp, tempbmp : TBitmap;
RT : TRect;
begin
try
if Uppercase(ExtractFileExt(FileName)) = '.JPG' then
begin
result := TjpegImage.Create;
result.LoadFromFile(FileName);
Height := Round(result.Height / WHRate*1.0);
Width := Round(result.Width / WHRate*1.0);
bmp := TBitmap.Create;
bmp.Width := Width;
bmp.Height := Height;
RT.Left := 0;
RT.Top := 0;
RT.Right := Width - 1;
RT.Bottom := Height - 1;
bmp.PixelFormat := pf24bit;
bmp.Canvas.StretchDraw(RT,result);
result.Assign(bmp);
result.CompressionQuality := Quality;
result.Compress;
end
else
exit;
finally
bmp.Free;
end;
end;
//觸發執行
Image1.Picture.Graphic := StretchImageSmall(ObjImgFilePath,3,100);
Image1.Picture.SaveToFile(IMGFilePath + '\123.jpg'); //生成縮略圖
jpeg.pas里的縮略演算法好像也不是非常強吧
感覺cximage的確不錯
uj5u.com熱心網友回復:
你還是用了StretchDraw,這個內部呼叫了Windows API StretchBlt或者TransparentStretchBlt,GDI實作的縮放是pixel resample演算法,速度快,但是效果差,容易產生鋸齒和變形,比較好的影像縮放演算法是bicubic resample,對于真實感影像(典型如照片)效果尤其好。我不太清楚GDI+的影像縮放用了什么演算法,但是效果要比GDI的好。uj5u.com熱心網友回復:
要不然自己計算每個點的值.uj5u.com熱心網友回復:
Graphics32確實能解決LZ的問題,可以網上搜索下的轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/116087.html
上一篇:如何定位影像的坐標?
