GDI+ ColorMatrix的完全揭秘与代码实现(下)
2008-09-09 19:25:20 来源:WEB开发网该过程中作了更详细的注释,其特点是处理速度较快。在我的机器上,不包括图像格式转换耗时,处理千万像素图片主对角线数据耗时不到50ms,而处理全部变换耗时350-400ms。
上面是通用的ColorMatrix处理过程,要处理GDI+或者TBitmap,还得进行些前期处理。GDI+的处理代码比较简单,而TBitmap的处理代码则比较复杂,因为TBitmap本身不具Alpha信息,必须人为地进行添加后再进行ColorMatrix运算,如果涉及到Alpha变换,还得处理其显示的问题(TBitmap可不会显示带Alpha信息的图片)。下面仅给出GDI+图像的ColorMatrix处理过程:
// 设置图像颜色矩阵。参数:Bmp: GDI+图像, Matrix, 颜色矩阵
procedure GdipSetColorMatrix(Bmp: TGpBitmap; Matrix: Gdiplus.TColorMatrix);
var
Data: TBitmapData;
begin
Data := Bmp.LockBits(GpRect(0, 0, Bmp.Width, Bmp.Height), [imWrite], pf32bppARGB);
try
SetColorMatrix(TImageData(Data), ImgUtils.TColorMatrix(Matrix));
finally
Bmp.UnlockBits(Data);
end;
end;
// 按颜色矩阵显示图像。参数:画布, 显示坐标, GDI+图像, Matrix, 颜色矩阵
procedure GdipColorMatrixDraw(Graphics: TGpGraphics; x, y: Integer;
Image: TGpImage; Matrix: Gdiplus.TColorMatrix);
var
tmp: TGpBitmap;
g: TGpGraphics;
Adapter: TStreamAdapter;
Stream: TStream;
Clsid: TGUID;
begin
if Image.PixelFormat < pf24bppRGB then
begin
tmp := TGpBitmap.Create(Image.Width, Image.Height, pf32bppARGB);
g := TGpGraphics.Create(tmp);
try
g.DrawImage(Image, 0, 0, Image.Width, Image.Height);
finally
g.Free;
end;
end
else if Image.ImageType = itBitmap then
tmp := TGpBitmap(Image).Clone(0, 0, Image.Width, Image.Height, pf32bppARGB)
else
begin
Stream := TMemoryStream.Create;
Adapter := TStreamAdapter.Create(Stream, soOwned);
GetEncoderClsid('image/bmp', Clsid);
IStream(Adapter)._AddRef;
Image.Save(Adapter, Clsid);
tmp := TGpBitmap.Create(Adapter);
end;
try
GdipSetColorMatrix(tmp, Matrix);
Graphics.DrawImage(tmp, x, y, tmp.Width, tmp.Height);
finally
tmp.Free;
if (Image.PixelFormat >= pf24bppRGB) and (Image.ImageType <> itBitmap) then
IStream(Adapter)._Release;
end;
end;
Tags:GDI ColorMatrix 完全
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接