2013-03-14 8 views
9

मैं अल्फा-पारदर्शी आयत और अल्फा-पारदर्शी छवियों के साथ काफी जटिल छवियों को आकर्षित करना चाहता हूं। There is GDI+ wrapper from Mitov, लेकिन ऐसा लगता है कि यह 32 बिट बीएमपी फाइलों का समर्थन नहीं करता है और यह उन्हें बचाता है और दस्तावेज़ीकरण भयानक है। बीएमपी पीएनजी की तुलना में तेज़ तरीके से हैं इसलिए मैं उनका उपयोग करना चाहता हूं। There is SynGDI wrapper of GDI+, लेकिन यह बहुत बुनियादी लगता है और इसके लिए कोई दस्तावेज नहीं है। वहाँ भी GDI के लिए इस चाल है:डेल्फी में अल्फा पारदर्शिता के साथ पारदर्शी कैसे आकर्षित करें?

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; 

लेकिन जब मैं अस्पष्टता = 255 से कॉल करने की यह 32 बिट बिटमैप ड्रॉ ठीक से नहीं (कुछ की तरह वे आधा पारदर्शी होते हैं, जहां वे पूरी तरह से होना चाहिए)। मैं पिक्सेल पारदर्शी बनाने के लिए स्कैनलाइन का उपयोग नहीं करना चाहता क्योंकि यह इस तरह के सभी पारदर्शी आयतों को आकर्षित करने के लिए बहुत जटिल होगा। मैं भी आधुनिक कंप्यूटर पर पतला जीडीआई + तेज होना चाहिए, क्या मैं सही हूँ?

तो सवाल यह है: कैसे एक अल्फा पारदर्शी आयत और आसानी से बिटमैप (कोड की टन के बिना) आकर्षित करने के लिए?

पसंदीदा डेल्फी: 7. मैं भी 2005 और XE3 है, लेकिन मैं सबसे 7 से काम करने के लिए कुछ चाहते हैं के बाद से 7 गति दानव है।

+1

आप इस्तेमाल कर सकते हैं, तो [ 'इस wrapper'] (http://www.bilsen.com/gdiplus/index.shtml) डेल्फी 2009 तक का समर्थन करता है, जो आप [' कोड लिख सकते हैं इस तरह की]] (http://pastebin.com/fcjtHKen) जो काफी जटिल दिखता है, लेकिन आपको यह जानना होगा कि आप ['रंग समायोजन'] को संशोधित कर सकते हैं (http://www.codeproject.com/Articles/3772/रंगमेट्रिक्स-मूलभूत-सरल-छवि-रंग-समायोजन) उस रंग मैट्रिक्स के साथ और यह कि मैं उस कोड में अल्फा मिश्रित होने के लिए फ़ाइल लोड कर रहा हूं (उदाहरण के लिए आप पास किए गए 'TBitmap' ऑब्जेक्ट से 'GPBitmap' बना सकते हैं)। – TLama

+0

@TLama धन्यवाद, यह एक जीडीआई + अब तक का सबसे अच्छा लगता है। दूसरा क्रोधित हैं। प्रोग्डिगी में से एक संकलित नहीं करता है (7, न ही 2005 और न ही XE3), मिटोव में से एक उन्हें चित्रित करने के बाद छवियों को नष्ट कर देता है, सिनोप्स से एक अधूरा है। – Tom

+1

एफडब्ल्यूआईडब्लू: मैंने पाया [इन लेखों] (http://itinerantdeveloper.blogspot.de/search/label/alpha%20transparency) काफी रोचक। –

उत्तर

8

आप साधारण TBitmap तैयार हैं, GDI + कार्यान्वयन के किसी भी बस bmp.Canvas.Handle बताए इस्तेमाल किया जा सकता। संकलन में आपकी समस्या फ़ोल्डर में पुराने DirctDraw-Version के कारण हो सकती है, बस इसे हटा दें।

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

धन्यवाद, बम्मी! मुझे bmp.AlphaFormat के बारे में पता नहीं था, क्योंकि मैंने XE3 खरीदा था, मैंने पुराने डेल्फी पर काम किया था और ऐसी कोई चीज़ नहीं थी। लेकिन अब, जब मैं बीएमपी करता हूं। अल्फाफार्मेट: = afDefined; मैं आमतौर पर 32 बिट बिटमैप्स और कैनवास लोड करता हूं। ड्रा() उन्हें! – Tom

+0

मैंने डायरेक्टड्रा.pas और प्रोगिडी के जीडीआई संकलन को भी ठीक से हटा दिया (कम से कम XE3 में), धन्यवाद! – Tom

संबंधित मुद्दे