2013-03-14 8 views
9

Я хочу нарисовать довольно сложные изображения с альфа-прозрачными прямоугольниками и альфа-прозрачными изображениями. There is GDI+ wrapper from Mitov, но, похоже, он не поддерживает 32-битные файлы BMP, и он пересказывает их, и документация ужасна. BMP быстрее, чем PNG, поэтому я хочу их использовать. There is SynGDI wrapper of GDI+, но он кажется очень простым, и для него нет документации. Существует также этот трюк для GDI:Как нарисовать прозрачность с альфа-прозрачностью в Delphi?

procedure DrawAlphaAPI(Source: TBitmap; Destination: TCanvas; 
    const X, Y: Integer; const Opacity: Byte = 255); 
var BlendFunc: TBlendFunction; 
begin 
    BlendFunc.BlendOp := AC_SRC_OVER; 
    BlendFunc.BlendFlags := 0; 
    BlendFunc.SourceConstantAlpha := Opacity; 

    if Source.PixelFormat = pf32bit then 
    BlendFunc.AlphaFormat := AC_SRC_ALPHA 
    else 
    BlendFunc.AlphaFormat := 0; 

    Windows.AlphaBlend(Destination.Handle, X, Y, Source.Width, Source.Height, 
    Source.Canvas.Handle, 0, 0, Source.Width, Source.Height, BlendFunc); 
end; 

Но когда я называю его Opacity = 255 она рисует 32-битные растровые изображения не правильно (что-то, что они являются полупрозрачными, где они должны быть полностью). Я не хочу использовать Scanline, чтобы сделать пикселы прозрачными, поскольку это будет слишком сложно, чтобы рисовать все прозрачные прямоугольники таким образом. Также я тонкий GDI + должен быть быстрее на современных компьютерах, верно?

Итак, вопрос: как рисовать альфа-прозрачный прямоугольник и растровое изображение легко (без тонны кода)?

Предпочитаемый Delphi: 7. У меня также есть 2005 и XE3, но поскольку 7 - демон скорости, я бы больше всего хотел, чтобы что-то работало с 7 до.

+1

Если вы можете использовать [ 'это wrapper'] (http://www.bilsen.com/gdiplus/index.shtml), который поддерживает Delphi 2009, вы можете написать [' код как это'] (http://pastebin.com/fcjtHKen), который выглядит довольно сложно, но вам нужно знать, что вы можете изменить ['color adjustment'] (http://www.codeproject.com/Articles/3772/ColorMatrix-Basics-Simple-Image-Color-Adjustment) с этой цветовой матрицей и что я загружаю файл, который должен быть альфам, смешанным в этом коде (например, вы можете создать «GPBitmap» из переданного объекта «TBitmap»). – TLama

+0

@TLama Спасибо, этот GDI + кажется лучшим до сих пор. Другие дрянные. Один из Progdigy не компилируется (7, ни 2005 или XE3), тот, который из Митова уничтожает изображения после их рисования, тот, что из Synopse является неполным. – Tom

+1

FWIW: Я нашел [эти статьи] (http://itinerantdeveloper.blogspot.de/search/label/alpha%20transparency) довольно интересным. –

ответ

8

Если вы подготовите обычный TBitmap, любую из реализаций GDI + можно использовать, просто назначив bmp.Canvas.Handle. Ваша проблема с компиляцией может быть вызвана старой версией DirctDraw в папке, просто удалите ее.

implementation 

uses GDIPAPI, GDIPOBJ; 
{$R *.dfm} 

Procedure PrepareBMP(bmp: TBitmap; Width, Height: Integer); 
var 
    p: Pointer; 
begin 
    bmp.PixelFormat := pf32Bit; 
    bmp.Width := Width; 
    bmp.Height := Height; 
    bmp.HandleType := bmDIB; 
    bmp.ignorepalette := true; 
    bmp.alphaformat := afPremultiplied; 
    // clear all Scanlines 
    p := bmp.ScanLine[Height - 1]; 
    ZeroMemory(p, Width * Height * 4); 
end; 

procedure TForm2.Button1Click(Sender: TObject); 
var 
    bmp: TBitmap; 
    G: TGPGRaphics; 
    B: TGPSolidBrush; 
begin 
    bmp := TBitmap.Create; 
    try 
    PrepareBMP(bmp, 300, 300); 
    G := TGPGRaphics.Create(bmp.Canvas.Handle); 
    B := TGPSolidBrush.Create(MakeColor(100, 255, 0, 0)); 
    try 
     G.SetSmoothingMode(SmoothingModeHighQuality); 
     G.FillEllipse(B, MakeRect(0.0, 0, 300, 300)); 
     B.SetColor(MakeColor(100, 0, 255, 128)); 
     G.FillEllipse(B, MakeRect(40.0, 40, 260, 260)); 
    finally 
     B.Free; 
     G.Free; 
    end; 
    // draw overlapping in Form Canvas to display transparency 
    Canvas.Draw(0, 0, bmp); 
    Canvas.Draw(100, 100, bmp); 
    finally 
    bmp.Free; 
    end; 
end; 

DEMO

+0

Спасибо, bummi! Я не знал о bmp.AlphaFormat, потому что, прежде чем я купил XE3, я работал над старым Delphis и не было = такой вещи. Но теперь, когда я делаю bmp.AlphaFormat: = afDefined; Я обычно загружаю 32-битные растровые изображения и Canvas.Draw() их! – Tom

+0

Я также удалил DirectDraw.pas и компиляторы Progdidy GDI просто отлично (по крайней мере, в XE3), спасибо! – Tom

Смежные вопросы