Bu yazımda IImage arabirimi kullanarak Kol-ce de resim işlemeyi anlatmaya çalışacağm.
IImage arabirimi sanırım Windows Mobile 5.0 dan itibaren geldi ve yaygın tüm formatları işleyebiliyor. Bu formatlar üzerinde herhan bir tuvale çizim, boyutlandırma ve döndürme fonksiyonları var.
Ayrıca resim formatı, derinlik ve boyut gibi bilgiler veren fonksiyonlarıda var. En önemlisi diğer Windows apiler ile çalışırken de gerekiyor.
IImage arabirimi Windows desktop da bulunan gdiplus ile uyumlu fakat resmi bir header Microsoft tarafından sonulmadı. Ayrıca FPC içinde herhangi bir translate yok. Burada gördüğünüz tüm unitleri ben çevirdim.
imaging.pas
GdiplusPixelFormats.pp
GdiplusImaging.pp
benimistream.pp (Istream için; normalde çok büyük header dosyasında olduğu için küçültüp bu ismi verdim.)
yeniactivex.pas (normal Activex unit de kullanabilirsiniz fakat exe boyutunun iki katına çıkacağını göreceksiniz)
IImagingFactory yardımı ile IImage birkaç yöntemle oluşturabiliriz.
[code lang=”Delphi”]
function CreateImageFromStream( stream :IStream; out image:IImage) :HRESULT;stdcall;
function CreateImageFromFile(filename :PWideChar;out image :IImage) :HRESULT;stdcall;
function CreateImageFromBuffer(buf :pointer;size : uint;disposalFlag: BufferDisposalFlag;out image:IImage):HRESULT;stdcall;
function CreateNewBitmap(width,height : uint;pixelFormat:PixelFormatID;out bitmap :IBitmapImage):HRESULT;stdcall;
function CreateBitmapFromImage(image :IImage;width,height : uint;pixelFormat :PixelFormatID;hints: InterpolationHint;out bitmap :IBitmapImage):HRESULT;stdcall;
function CreateBitmapFromBuffer(bitmapData_:BitmapData;out bitmap:IBitmapImage):HRESULT;stdcall;
function CreateImageDecoder(stream : IStream;flags :DecoderInitFlag; out decoder : IImageDecoder):HRESULT;stdcall;
function CreateImageEncoderToStream(CLSID_ : CLSID;stream:IStream; out encoder:IImageEncoder):HRESULT;stdcall;
function CreateImageEncoderToFile(clsid_ :clsid ; filename :WChar;out encoder: IImageEncoder):HRESULT;stdcall;
[/code]
Basit şekilde kullanımı aşağıdaki gibidir.
[code lang=”Delphi”]
procedure TForm1.ResimYukle;
var
pFactory: IImagingFactory;
pImage: IImage;
yol :array[0..MAX_PATH] of widechar;
pimgInfo: ImageInfo;
yer: TRect;
pb:PBitmap;
begin
yol:=ExtractFilePath(ExePath)+’noktalogo.png’;
FillChar(pimgInfo,sizeof(pimgInfo),0);
if CoCreateInstance(CLSID_ImagingFactory,nil,1,IID_IImagingFactory,pFactory)=S_OK then
begin
if pFactory.CreateImageFromFile(yol,pImage)=s_ok then
begin
pImage.GetImageInfo(pimgInfo);
SetRect(yer,0,0,pimgInfo.Width ,pimgInfo.Height);
pImage.Draw(Form.canvas.Handle,@yer,nil);
pImage:=nil;
{
//bitmap resmin üzerine çizmek için
pb:=NewBitmap(pimgInfo.Width,pimgInfo.Height);
pb.canvas.brush.color:=Form.color;
pb.canvas.fillrect(pb.canvas.cliprect);
pImage.Draw(pb.canvas.Handle,@yer,nil);
pb.Draw(form.canvas.Handle,0,0);
pb.clear;
pb.free;
}
end;
pFactory:=nil;
end;
yol:=”;
end;
[/code]
İlgili dosyalar: