ImageEn for Delphi and C++ Builder ImageEn for Delphi and C++ Builder

 

ImageEn Forum
Profile    Join    Active Topics    Forum FAQ    Search this forumSearch
Forum membership is Free!  Click Join to sign-up
Username:
Password:
Save Password
Forgot your Password?

 All Forums
 ImageEn Library for Delphi, C++ and .Net
 ImageEn and IEvolution Support Forum
 Write Text not Transparent but Opaque background
 New Topic  Reply to Topic
Author Previous Topic Topic Next Topic  

john_siggy@yahoo.com

USA
167 Posts

Posted - Jan 27 2018 :  10:05:01  Show Profile  Reply
Want to write text with an opaque background. This is similar to text with a transparent background but some of the background shows through. Want to use GDI Plus

Thanks in Advance,

w2m

USA
1990 Posts

Posted - Jan 27 2018 :  10:07:37  Show Profile  Reply
What version of ImageEn are you using?

Bill Miller
Adirondack Software & Graphics
Email: w2m@hughes.net
EBook: http://www.imageen.com/ebook/
Custom Commercial ImageEn Development
Go to Top of Page

john_siggy@yahoo.com

USA
167 Posts

Posted - Jan 27 2018 :  13:18:10  Show Profile  Reply
Thanks for your interest. I am using 7.0.1 but may upgrade if needed.
Go to Top of Page

w2m

USA
1990 Posts

Posted - Jan 27 2018 :  13:22:55  Show Profile  Reply
My recommendation is to upgrade to 7.5, because it has text layers which makes it easy to reposition the text with the mouse and change Background colors, font colors, font name and text size and font attributes on the fly:
procedure TForm1.TextLayer1Click(Sender: TObject);
var
  i: Integer;
  iLayer: Integer;
begin
  Screen.Cursor := crHourglass;
  try
    ImageEnView1.Proc.SaveUndo('Add Text Layer ' +
      IntToStr(ImageEnView1.Proc.UndoCount + 1));
    Undo1.Hint := ImageEnView1.Proc.UndoCaptions[0];
    Undo1.Enabled := ImageEnView1.Proc.CanUndo;
    iLayer := ImageEnView1.LayersAdd(ielkText);
    ImageEnView1.Layers[iLayer].Name := 'Text Layer';
    TIETextLayer(ImageEnView1.CurrentLayer).Text := EditText1.Text;
    ImageEnView1.Layers[iLayer].PosX := ImageEnView1.Layers[iLayer - 1]
      .PosX + 100;
    ImageEnView1.Layers[iLayer].PosY := ImageEnView1.Layers[iLayer - 1]
      .PosY + 100;
    ImageEnView1.MouseInteract := ImageEnView1.MouseInteract +
      [miMoveLayers, miResizeLayers];
    if ImageEnView1.Layers[ImageEnView1.LayersCurrent].Width >
      ImageEnView1.IEBitmap.Width then
      ImageEnView1.Layers[ImageEnView1.LayersCurrent].Width :=
        ImageEnView1.IEBitmap.Width;
    TIETextLayer(ImageEnView1.CurrentLayer).Alignment := iejCenter;
    TIETextLayer(ImageEnView1.CurrentLayer).Layout := ielCenter;
    TIETextLayer(ImageEnView1.CurrentLayer).BorderColor := clNone;
    TIETextLayer(ImageEnView1.CurrentLayer).FillColor := ColorBox2.Selected;
    TIETextLayer(ImageEnView1.CurrentLayer).FillColor2 := ColorBox2.Selected;
    TIETextLayer(ImageEnView1.CurrentLayer).BorderWidth := 0;
    TIETextLayer(ImageEnView1.CurrentLayer).Font.Size :=
      UpDownPenSize1.Position;
    TIETextLayer(ImageEnView1.CurrentLayer).Font.Color := ColorBox1.Selected;
    if Bold1.Down then
      TIETextLayer(ImageEnView1.CurrentLayer).Font.Style := [fsBold];
    if Italic1.Down then
      TIETextLayer(ImageEnView1.CurrentLayer).Font.Style :=
        TIETextLayer(ImageEnView1.CurrentLayer).Font.Style + [fsITalic];
    if UnderLine1.Down then
      TIETextLayer(ImageEnView1.CurrentLayer).Font.Style :=
        TIETextLayer(ImageEnView1.CurrentLayer).Font.Style + [fsUnderline];
    TIETextLayer(ImageEnView1.CurrentLayer).AutoSize := True;
    ImageEnView1.LayersCurrent := iLayer;
    UpdateStatusBar;
  finally
    Screen.Cursor := crDefault;
  end;
end;


With older versions you could try LayersCreateFromText, but 7.5 works the best and the text in the layer is not editable without 7.5:
procedure TForm1.ImageEnView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  iX := ImageEnView1.Layers[ImageEnView1.LayersCurrent].ConvXScr2Bmp(X);
  iY := ImageEnView1.Layers[ImageEnView1.LayersCurrent].ConvYScr2Bmp(Y);
  if AddText1.Down then
  begin
    if Bold1.Checked then
      iLayer := ImageEnView1.LayersCreateFromText(Trim(Text1.Text),
        Font1.Items[Font1.ItemIndex], StrToIntDef(FontSize1.Text, 20),
        PenColor1.Selected, [fsBold], Shadow1.Checked, 3, 2, 0,
        AntiAlias1.Checked)
    else
      iLayer := ImageEnView1.LayersCreateFromText(Trim(Text1.Text),
        Font1.Items[Font1.ItemIndex], StrToIntDef(FontSize1.Text, 20),
        PenColor1.Selected, [], Shadow1.Checked, 3, 2, 0, AntiAlias1.Checked);
    if iLayer <> -1 then
    begin
      ImageEnView1.Layers[iLayer].PosX := iX;
      ImageEnView1.Layers[iLayer].PosY := iY;
    end;
end;


You can also try iIECanvas.DrawText, but the text is not editable:
procedure TForm1.DrawText;
var
  iPenSize: Integer;
  iPenColor: TColor;
  iPenAlpha: Integer;
  iIECanvas: TIECanvas;
begin
  MyUndo(ImageEnView1);
  { Draw on the Non-Alpha Canvas }
  iIECanvas := TIECanvas.Create(ImageEnView1.IEBitmap.Canvas,
    AntiAlias1.Checked, UseGDIPlus1.Checked);
  iPenSize := StrToIntDef(PenSize1.Text, 20);
  iPenColor := PaintColor.Color;
  iPenAlpha := 255;
  iIECanvas.Font.Name := 'Arial';
  iIECanvas.Font.Size := iPenSize;
  iIECanvas.Font.Color := iPenColor;
  iIECanvas.Font.Style := [fsBold];
  iIECanvas.Font.Height := 72;
  iIECanvas.DrawText( EditText1.Text, Rect(0, 0, 500, 300));
  ImageEnView1.Bitmap.Modified := ImageEnView1.Proc.CanUndo;
  ImageEnView1.Update;
end;

Go to Top of Page

john_siggy@yahoo.com

USA
167 Posts

Posted - Jan 28 2018 :  11:47:05  Show Profile  Reply
Looking for Opaque Text Background not transparent as in all your examples. Please see the attached image for examples of opaque background for text. In the third example you set: iPenAlpha := 255 but never use iPenAlpha.






Regards
Go to Top of Page

w2m

USA
1990 Posts

Posted - Jan 28 2018 :  11:58:40  Show Profile  Reply
Still not visible. Can you email me the bitmap or at least answer my question. I can not help unless I understand you.

Bill Miller
Adirondack Software & Graphics
Email: w2m@hughes.net
EBook: http://www.imageen.com/ebook/
Custom Commercial ImageEn Development
Go to Top of Page

john_siggy@yahoo.com

USA
167 Posts

Posted - Jan 28 2018 :  11:58:46  Show Profile  Reply
Text is normal but behind the clear text is an opaque background that allows, say half of the background to show Through. Somewhere between a transparent background and a background of, say, white.
Go to Top of Page

john_siggy@yahoo.com

USA
167 Posts

Posted - Jan 28 2018 :  12:10:44  Show Profile  Reply
Hi Bill,

I Emailed an example

Insert Image:
Go to Top of Page

w2m

USA
1990 Posts

Posted - Jan 28 2018 :  12:11:57  Show Profile  Reply
Got it... Give me some time to try this.

Bill Miller
Adirondack Software & Graphics
Email: w2m@hughes.net
EBook: http://www.imageen.com/ebook/
Custom Commercial ImageEn Development
Go to Top of Page

w2m

USA
1990 Posts

Posted - Jan 28 2018 :  14:58:04  Show Profile  Reply
John,

Here are 3 ways to achieve your objective:

procedure TForm1.TextLayer1Click(Sender: TObject);
var
  iLayer: Integer;
begin
  Screen.Cursor := crHourglass;
  try
    ImageEnView1.Proc.SaveUndo('Add Text Layer ' +
      IntToStr(ImageEnView1.Proc.UndoCount + 1));
    Undo1.Hint := ImageEnView1.Proc.UndoCaptions[0];
    Undo1.Enabled := ImageEnView1.Proc.CanUndo;
    iLayer := ImageEnView1.LayersAdd(ielkText);
    ImageEnView1.Layers[iLayer].Name := 'Text Layer';
    EditText1.Text := 'Security Monitor Pro- Text Layer';
    TIETextLayer(ImageEnView1.CurrentLayer).Text := EditText1.Text;
    ImageEnView1.Layers[iLayer].PosX := ImageEnView1.Layers[iLayer - 1]
      .PosX + 100;
    ImageEnView1.Layers[iLayer].PosY := ImageEnView1.Layers[iLayer - 1]
      .PosY + 100;
    ImageEnView1.MouseInteract := ImageEnView1.MouseInteract +
      [miMoveLayers, miResizeLayers];
    ImageEnView1.Layers[ImageEnView1.LayersCurrent].Height :=
      ImageEnView1.IEBitmap.Height div 4;
    ImageEnView1.Layers[ImageEnView1.LayersCurrent].Width :=
      ImageEnView1.IEBitmap.Width div 3;
    TIETextLayer(ImageEnView1.CurrentLayer).AutoSize := False;
    TIETextLayer(ImageEnView1.CurrentLayer).Alignment := iejCenter;
    TIETextLayer(ImageEnView1.CurrentLayer).Layout := ielCenter;
    TIETextLayer(ImageEnView1.CurrentLayer).BorderColor := clNone;
    TIETextLayer(ImageEnView1.CurrentLayer).FillColor := ColorBox2.Selected;
    TIETextLayer(ImageEnView1.CurrentLayer).FillColor2 := ColorBox2.Selected;
    TIETextLayer(ImageEnView1.CurrentLayer).Transparency := UpDown1.Position;
    TIETextLayer(ImageEnView1.CurrentLayer).BorderWidth := 0;
    TIETextLayer(ImageEnView1.CurrentLayer).Font.Size :=
      UpDownPenSize1.Position;
    TIETextLayer(ImageEnView1.CurrentLayer).Font.Color := ColorBox1.Selected;
    if Bold1.Down then
      TIETextLayer(ImageEnView1.CurrentLayer).Font.Style := [fsBold];
    if Italic1.Down then
      TIETextLayer(ImageEnView1.CurrentLayer).Font.Style :=
        TIETextLayer(ImageEnView1.CurrentLayer).Font.Style + [fsITalic];
    if UnderLine1.Down then
      TIETextLayer(ImageEnView1.CurrentLayer).Font.Style :=
        TIETextLayer(ImageEnView1.CurrentLayer).Font.Style + [fsUnderline];
    ImageEnView1.LayersCurrent := iLayer;
    ImageEnView1.Update;
    UpdateStatusBar;
  finally
    Screen.Cursor := crDefault;
  end;
end;

procedure TForm1.CreateLayerFromText1Click(Sender: TObject);
var
  iLayer: Integer;
begin
  EditText1.Text := 'Security Monitor Pro- Create Layer From Text';
  if Bold1.Down then
    iLayer := ImageEnView1.LayersCreateFromText(Trim(EditText1.Text), 'Arial',
      UpDownPenSize1.Position, ColorBox1.Selected, [fsBold], False, 3, 2, 0,
      AntiAlias1.Checked)
  else
    iLayer := ImageEnView1.LayersCreateFromText(Trim(EditText1.Text), 'Arial',
      UpDownPenSize1.Position, ColorBox1.Selected, [], False, 3, 2, 0,
      AntiAlias1.Checked);
  ImageEnView1.Proc.CastColor(0, ImageEnView1.IEBitmap.Height-1, TColor2TRGB(ColorBox2.Selected), 15);
  ImageEnView1.Proc.CastAlpha(0, ImageEnView1.IEBitmap.Height-1, TrackBarTransparency1.Position, 15);
  if iLayer <> -1 then
  begin
    ImageEnView1.Layers[iLayer].PosX := 0;
    ImageEnView1.Layers[iLayer].PosY := 0;
  end;
  ImageEnView1.MouseInteract := ImageEnView1.MouseInteract +
    [miMoveLayers, miResizeLayers];
  ImageEnView1.Update;
end;

procedure TForm1.RawText1Click(Sender: TObject);
begin
  // Add a new layer
  ImageEnView1.LayersAdd;
  ImageEnView1.CurrentLayer.PosX := 0;
  ImageEnView1.CurrentLayer.PosY := 0;
  ImageEnView1.CurrentLayer.Height := ImageEnView1.IEBitmap.Height div 4;
  ImageEnView1.CurrentLayer.Width := ImageEnView1.IEBitmap.Width;
  // White fill the new layer
  ImageEnView1.Proc.Fill(ColorBox2.Selected);
  // Make the white background transparent
  ImageEnView1.Proc.SetTransparentColors(TColor2TRGB(ColorBox2.Selected), TColor2TRGB(ColorBox2.Selected), TrackBarTransparency1.Position);
  EditText1.Text := ' Security Monitor Pro- Text Out ';
  // Output our text
  ImageEnView1.Proc.TextOut(Align_Text_Horz_Center, Align_Text_Vert_Center, EditText1.Text, 'Arial', UpDownPenSize1.Position, ColorBox1.Selected, [fsBold]);
  ImageEnView1.MouseInteract := ImageEnView1.MouseInteract +
    [miMoveLayers, miResizeLayers];
  ImageEnView1.Update;
end;


If none of these meet your needs then please discuss with Nigel.

Bill Miller
Adirondack Software & Graphics
Email: w2m@hughes.net
EBook: http://www.imageen.com/ebook/
Custom Commercial ImageEn Development

Go to Top of Page

john_siggy@yahoo.com

USA
167 Posts

Posted - Jan 28 2018 :  19:43:01  Show Profile  Reply
Thanks a lot Bill. Need to upgrade to 7.5.

Cheers,

John
Go to Top of Page

xequte

39053 Posts

Posted - Jan 29 2018 :  02:32:20  Show Profile  Reply
Hi John

Sorry, the forum attachment code can't handle the @ symbol in your username I have encoded as %40

Nigel
Xequte Software
www.imageen.com
Go to Top of Page
  Previous Topic Topic Next Topic  
 New Topic  Reply to Topic
Jump To: