2008-12-11 16 views
6

मैं एक छवि (जेपीजी, बीएमपी), या पारदर्शी पाठ (समान पृष्ठभूमि छवि के रूप में रंग) पर एक अर्ध पारदर्शी पाठ कैसे लिख सकता हूं लेकिन एक छाया के साथ, मैं छवियों को वॉटरमार्क करने के लिए कुछ करना चाहता हूं ।छवि पर पारदर्शी पाठ लिखना

मैं डेल्फी win32 का उपयोग करके इसे पूरा करना चाहता हूं।

उत्तर

3

मुझे लगता है कि आप जो हासिल करने की कोशिश कर रहे हैं वह एक पारदर्शी पृष्ठभूमि के साथ पाठ लिखने से थोड़ा अधिक जटिल है; यानी आप छवि पर लिखे गए अल्फा-मिश्रित पाठ का कुछ रूप प्राप्त करने की कोशिश कर रहे हैं।
जीडीआई + दिनचर्या का उपयोग करना सबसे आसान तरीका होगा। वे डेल्फी के लिए encapsulated हैं और http://www.progdigy.com/ से डाउनलोड के लिए उपलब्ध हैं। वहां कई उदाहरण हैं जो एक उदाहरण के रूप में प्रयोग योग्य होना चाहिए।

+0

Progdigy.com नीचे है? मैं इसका उपयोग नहीं कर सकता – Ampere

+0

ऐसा प्रतीत होता है कि डेल्फी और एम्बरकाडेरो के लिए 'जीडीआई प्लस' के डेवलपर के बीच कुछ असहमति थी, मुझे नहीं पता कि इसे इसके जवाब में खींचा गया है या नहीं। आप एरिक वान बिल्सन [जीडीआई प्लस] (http://www.bilsen.com/gdiplus/index.shtml) जैसे कुछ विकल्पों की खोज करने का प्रयास कर सकते हैं। – Petesh

2

मैंने इसका परीक्षण नहीं किया है, लेकिन यह आपको कुछ विचार देगा जहां जाना है। कुंजी ब्रश शैली है।

कुछ इस तरह:

img.Canvas.Brush.Style:=bsClear; 
img.Canvas.Font.Color:=clBlack; 
img.Canvas.TextOut(0, 0, 'hi there'); 
+0

एक्स-रे, कि लिखेंगे काले रंग के साथ पाठ, मैं पाठ अर्ध पारदर्शी होना चाहता हूँ एनटी या पारदर्शी छाया –

+0

फ़ॉन्ट रंग का उपयोग किया जाता है, पेन रंग –

+0

> फ़ॉन्ट रंग का उपयोग नहीं किया जाता है, कलम रंग सुधार के लिए धन्यवाद, जिम। –

3

छाया आसान है:

// Bold shows up better when over an image 
image1.Canvas.Font.Style := [fsBold]; 
// Write the shadow first 
image1.Canvas.Brush.Style:=bsClear; 
image1.Canvas.Font.Color := clGrayText; 
image1.Canvas.TextOut(1, 1, 'hi there'); 
// Then put the text on top (slightly offset) 
image1.Canvas.Brush.Style:=bsClear; 
image1.Canvas.Font.Color :=clBlack; 
image1.Canvas.TextOut(0, 0, 'hi there'); 

यह एक पारदर्शी पृष्ठभूमि के साथ पाठ है। या आप चाहते थे कि पाठ स्वयं ही पारदर्शी हो? वह थोड़ा सा ट्रिकियर है। आपको इसे मैन्युअल रूप से आकर्षित करने की आवश्यकता होगी। इसके बजाय इसे करने का एक आसान तरीका छवि पर आपके द्वारा लिखे गए क्षेत्र के रंग का औसत नमूना देना होगा। फिर अपने फ़ॉन्ट रंग को थोड़ा हल्का और अपनी छाया थोड़ा गहरा होने के लिए सेट करें। फिर यह मिश्रण में

+0

जिम, मैं छाया के साथ पारदर्शी पाठ चाहता था, या अर्द्ध पारदर्शी पाठ पारदर्शी पृष्ठभूमि –

+0

हाँ मुझे यकीन नहीं था। अल्फा मिश्रण थोड़ा और मुश्किल है। –

+0

अच्छा कोड, सरल लेकिन काम करता है। +1 –

1

आप एक छवि को सामान्य कैनवास में मर्ज करने के लिए bitblt दिनचर्या का उपयोग कर सकते हैं, फिर छवि को फिर से सहेजें।

+1

skamradt, कोई नमूना कोड? –

6

एक विकल्प Windows.pas इकाई में अल्फाब्लेंड फ़ंक्शन का उपयोग करना है।


uses Windows, Graphics; 
. 
. 
. 
var 
    BackgroundImage: Graphics.TBitmap; { need to call out specifically for Graphics.TBitmap 
             because the Windows unit also has a TBitmap 
             declaration } 
    TextImage: Graphics.TBitmap; 
    BlendFunc: BLENDFUNCTION; 
begin 
    BlendFunc.BlendOp := AC_SRC_OVER; 
    BlendFunc.BlendFlags := 0; 
    BlendFunc.SourceConstantAlpha := $C0; { a hex value from $00-$FF (0-255). 
              Represents the percent of opaqueness: 
              $00 is completely transparent, 
              $FF is completely opaque. 
              $C0 is 75% opaque } 
    BlendFunc.AlphaFormat := AC_SRC_ALPHA; 

    { BackgroundImage is for holding the image you want to overlay text onto } 
    BackgroundImage := Graphics.TBitmap.Create; 
    try 
     BackgroundImage.LoadFromFile('yourimagehere.bmp'); 

     { Create another TBitmap to hold the text you want to overlay } 
     TextImage := Graphics.TBitmap.Create; 
     try 
     { Set this bitmap to have the same dimensions as the 
      background image you want the text to appear on. } 
     TextImage.Height := BackgroundImage.Height; 
     TextImage.Width := BackgroundImage.Width; 

     { In my limited experience with AlphaBlend, Black is always 100% 
      transparent. So, paint TextImage completely Black. Play around 
      with this to see the effect it has on the final outcome. } 
     TextImage.Canvas.Brush.Color := clBlack; 
     TextImage.Canvas.FloodFill(0, 0, clNone, fsBorder); 

     TextImage.Canvas.Font.Style := [fsBold]; 

     { Write the shadow first } 
     TextImage.Canvas.Brush.Style := bsClear; 
     TextImage.Canvas.Font.Color := clDkGray; 
     TextImage.Canvas.TextOut(11, 11, 'Test'); 

     { Then put the text on top (slightly offset) } 
     TextImage.Canvas.Brush.Style := bsClear; 
     TextImage.Canvas.Font.Color := clMaroon; 
     TextImage.Canvas.TextOut(10, 10, 'Test'); 

     { Use the AlphaBlend function to overlay the bitmap holding the text 
      on top of the bitmap holding the original image. } 
     Windows.AlphaBlend(BackgroundImage.Canvas.Handle, 0, 0, 
          TextImage.Width, TextImage.Height, 
          TextImage.Canvas.Handle, 0, 0, TextImage.Width, 
          TextImage.Height, BlendFunc); 

     { Assign the now updated BackgroundImage to a TImage control for display } 
     Image1.Picture.Bitmap.Assign(BackgroundImage); 
     finally 
     TextImage.Free; 
     end; 
    finally 
     BackgroundImage.Free; 
    end; 
    end; 
2

इस समारोह डेव Elsberry के विचार पर आधारित है: एक छवि पर ओवरले - कुछ इस तरह अर्द्ध पारदर्शी पाठ (जिम McKeeth की प्रतिक्रिया पर इमारत एक बूंद छाया के साथ) का उत्पादन करेगा।

क्या अलग है:

  • खींचता केवल छाया पारदर्शी रूप से
  • यह का उपयोग करता है लगभग 2 गुना कम रैम
  • पैरामीटर

procedure DrawShadowText(aCanvas: TCanvas; CONST Text: string; CONST X, Y, Opacity: Integer; TextColor, ShadowColor: TColor);  
{ Opacity a value from 0-255: 
    $00 is completely transparent, 
    $FF is completely opaque. 
    $C0 is 75% opaque } 
CONST ShadowSize= 1; 
VAR 
    TempBMP: TBitmap; 
    BlendFunc: BLENDFUNCTION; 
    H, W: Integer; 
begin 
BlendFunc.BlendOp := AC_SRC_OVER; 
BlendFunc.BlendFlags := 0; 
BlendFunc.SourceConstantAlpha := Opacity; 
BlendFunc.AlphaFormat := AC_SRC_ALPHA; 

{ Create another TBitmap to hold the text you want to overlay } 
TempBMP := Graphics.TBitmap.Create; 
TRY 
    TempBMP.Canvas.Font.Style := [fsBold]; 
    TempBMP.Canvas.Brush.Style := bsClear; 

    W:= TempBMP.Canvas.TextWidth(Text); 
    H:= TempBMP.Canvas.TextHeight(Text); 

    TempBMP.SetSize(W+ShadowSize, H+ShadowSize); 

    { In AlphaBlend, Black is always 100% transparent. So, paint TempBMP completely Black. } 
    TempBMP.Canvas.Brush.Color := clBlack; 
    TempBMP.Canvas.FloodFill(0, 0, clNone, fsBorder); 

    { Write the shadow first } 
    TempBMP.Canvas.Font.Color := ShadowColor; 
    TempBMP.Canvas.TextOut(ShadowSize, ShadowSize, Text);  { Diagonal left shadow } 
    TempBMP.Canvas.TextOut(ShadowSize, 0,   Text);  { Left shadow } 

    { Draw the text with transparency: 
    TempBMP.Canvas.Brush.Style := bsClear; 
    TempBMP.Canvas.Font.Color := TextColor; 
    TempBMP.Canvas.TextOut(0, 0, Text); } 

    { Use the AlphaBlend function to overlay the bitmap holding the text on top of the bitmap holding the original image. } 
    Windows.AlphaBlend(aCanvas.Handle, 
         x, y, TempBMP.Width, TempBMP.Height, 
         TempBMP.Canvas.Handle, 0, 0, TempBMP.Width, TempBMP.Height, 
         BlendFunc); 

    { Draw the text at 100% opacity } 
    aCanvas.Font.Style := [fsBold]; 
    aCanvas.Brush.Style := bsClear; 
    aCanvas.Font.Color := TextColor; 
    aCanvas.TextOut(x, y-1, Text); 
FINALLY 
    FreeAndNil(TempBMP); 
END; 
end; 



procedure TfrmTest.UseIt; 
VAR BackgroundImage: tbitmap; 
begin 
BackgroundImage := Graphics.TBitmap.Create; 
try 
    BackgroundImage.LoadFromFile('c:\test.bmp'); 
    DrawShadowText (BackgroundImage.Canvas, 'This is some demo text', 20, 40, 140, clRed, clSilver); 
    Image1.Picture.Bitmap.Assign(BackgroundImage); 
FINALLY 
    BackgroundImage.Free; 
end; 
end; 
संबंधित मुद्दे