Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Graphics32 - Layer (Transparenz, zechnen) (https://www.delphipraxis.net/69614-graphics32-layer-transparenz-zechnen.html)

simlei 17. Mai 2006 19:33


Graphics32 - Layer (Transparenz, zechnen)
 
Hallo! Ich will in ein TBitmap32 einen Layer zeichnen, der (was bei Layern ja so ist :) ) einen bestimmten Inhalt hat; es soll auch der Alpha-Wert verändert werden können. Leider ist das Problem, dass zur Zeit zwar ein Layer vorhanden ist (ich habe ihn in die Layercollection vom Image32 gesetzt), aber er zeichent sich von selbst a) an die Position 0,0; b) kann ich nicht irgendwie sagen (zeichne(positionx, y, z, alpha), womit ich die pos. und Alpha verändern kann.

Mein Quelltext sieht zur Zeit so aus:
Wenn jemand Hinweise, Lösungsvorschlag ... hat: hierher!! :D
vielen Dank schonmal!

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, GR32, GR32_Image, GR32_Transforms, GR32_Resamplers,
  GR32_Layers, ExtCtrls, Buttons, ComCtrls, Grids, GR32_RangeBars;

type
  TForm1 = class(TForm)
    Image321: TImage32;
    Button1: TButton;
    Image322: TImage32;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}


procedure createImg32(var ziel:TImage32; color:Integer);
var leer:TBitmap32;
begin
 leer := TBitmap32.Create;
 leer.SetSize(ziel.Width, ziel.Height);
 leer.Canvas.Brush.Color := color;
 leer.Canvas.Rectangle(-1, -1, ziel.Width+2, ziel.Height+2);
 ziel.Bitmap.Assign(leer);
end;

procedure createBmp32Layer(var ziel:TBitmapLayer; Image: TImage32; color, breite, hoehe:Integer);
var leer:TBitmap32;
    layer:TBitmapLayer;
begin
 ziel:=TBitmapLayer.Create(Image.Layers);
 leer := TBitmap32.Create;
 leer.SetSize(breite, hoehe);
 leer.Canvas.Brush.Color := color;
 leer.Canvas.Rectangle(-1, -1, breite+2, hoehe+2);
 ziel.Bitmap.Assign(leer);
end;

procedure TForm1.Button1Click(Sender: TObject);
var layer:TBitmapLayer;
    leer:TBitmap32;
begin
 Image321.Bitmap.LineToFS(100, 100);
 Image321.Bitmap.Textout(100, 100, 'HALLOWELT');
 createBmp32Layer(layer, Image321, clred, 30, 100);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
createImg32(Image321, clgreen);
end;

end.

DGL-luke 17. Mai 2006 19:38

Re: Graphics32 - Layer (Transparenz, zechnen)
 
Da ich die Lib im Moment nicht zur Verfügung habe, kann ich dir nur die HIlfedatei empfehlen, die im Download-Package dabei gewesen sein muss (GR32.hlp denke ich).

Vielleicht findest du da ja was.

simlei 17. Mai 2006 19:42

Re: Graphics32 - Layer (Transparenz, zechnen)
 
Naja.. mit der habe ich ja gerade mal das geschafft, was hier zu lesen ist :roll:
oder hat jmd. ein gutes tut? das wär noch besser!

dizzy 18. Mai 2006 04:42

Re: Graphics32 - Layer (Transparenz, zechnen)
 
Ein Layer ist in der G32 immer so groß wie sein Image. Daher verwende ich sie (Layer) mittlerweile nicht mehr, sondern zeichne entsprechende "Sprites" per Draw der Reihe nach in ein Offscreen-Bitmap, welches dann komplett aufs Image wandert. Dabei geht zwar die Möglichkeit des Alpha gesteuerten Clickens auf Layer flöten, aber das ist ebenfalls verhältnismäßig einfach selbst einbaubar.
Ich bin übrigends auch lange auf der Suche nach den Parametern zum Verschieben von Layern gewesen, und bin bis heute etwas baff, dass ich sie nicht finden konnte. Mittlerweile bin ich davon überzeugt, dass es sie tatsächlich nicht gibt 8)


Gruss,
Fabian

simlei 18. Mai 2006 10:14

Re: Graphics32 - Layer (Transparenz, zechnen)
 
so. 1,5 Probleme sind gelöst: per mylayer.Location kann die Position festgelegt werden. Und wenn ich Image321.Bitmap.DrawMode auf dmBlend setze, so kann ich auch mit MasterAlpha arbeiten. nur: Alles was auf dem Image321.Bitmap.Canvas gezeichnet wird, ist immer komplett intransparen, unabhängig vom MasterAlpha; das ist ein Problem, da auf dem Image321,Bitmap nicht Kreise, Rechtecke ... gezeichnetwerden können und so viele Objekte nicht transparent geschaltet werden können.
Wie kann ich es bewerkstelligen, dass auch die Transparenz vom Bitmap.Canvas gesetzt werden kann? (vllt kann man ja den Inhalt des Canvas auf das Bitmap zeichnen, nur weiß ich nicht, wie das geht...).
Idee, anyone? :D

moonwhaler 18. Mai 2006 10:38

Re: Graphics32 - Layer (Transparenz, zechnen)
 
Ich habe vor kurzem eine kleine Prozedur gebastelt, die mir auf einem TImage32 ein Layer erstellt und einen Alpha setzt. Dies war für mich wichtig, damit ich quasi ein MouseEnter mit Alpha-Effekt habe:

Delphi-Quellcode:
 
procedure ImageAlpha( Image: TImage32;
                      Layer: TBitmap32;
                      Background: TBitmap32 = nil );
var
  L: TBitmapLayer;
const
  MasterAlpha: SmallInt = 100;
  Width: SmallInt = 24;
  Height: SmallInt = 24;
  Left: SmallInt = 0;
  Top: SmallInt = 0;
begin
  Image.Layers.Clear();

  if ( Assigned( Background ) ) then
    Image.Bitmap := Background;

  L := TBitmapLayer.Create( Image.Layers );
  L.Bitmap.SetSize( Width, Height );
  L.Location := FloatRect( Left, Top, Width, Height );
  L.Bitmap.CombineMode := cmBlend;
  L.Bitmap.DrawMode := dmBlend;
  L.Bitmap := Layer;
  L.Bitmap.MasterAlpha := MasterAlpha;
end;
Der Aufruf ist sehr einfach:

Delphi-Quellcode:
ImageAlpha( lock_image_bg, icon_list.Bitmaps[0].Bitmap );
Bei MouseEnter beim entsprechenden TImage32 dann folgendes:

Delphi-Quellcode:
 
if ( Sender is TImage32 ) then
  with Sender as TImage32 do
    TBitmapLayer( Layers[0] ).Bitmap.MasterAlpha := 255;
Und bei MouseLeave:

Delphi-Quellcode:
 
if ( Sender is TImage32 ) then
  with Sender as TImage32 do
    TBitmapLayer( Layers[0] ).Bitmap.MasterAlpha := 100;
Lässt sich natürlich beliebig ausbauen... :)

dizzy 19. Mai 2006 00:56

Re: Graphics32 - Layer (Transparenz, zechnen)
 
Zitat:

Zitat von simlei
per mylayer.Location kann die Position festgelegt werden.

:wall: Und ich such mich krümmelig danach... Wieder was gelernt :D

Dem Problem mit dem Canvas bin ich auch schon mal begegnet. Hier ist imho das Problem, dass der Canvas ein "handelsüblicher" Windowscanvas ist, der vom Alpha der G32 nix wissen kann. Hier wäre es in der Tat sehr schön, wenn es entsprechende Pendants für TBitmap32 gäbe, wie sie schon zum Zeichnen von z.B. Linien ja durchaus vorhanden sind.
Ein entsprechender Workaround hinge von dem genauen Problem ab; generell gelöst wäre das ganze jedoch erst, wenn man TBitmap32 manuell um entsprechende Zeichenroutinen erweitert.

DGL-luke 19. Mai 2006 14:58

Re: Graphics32 - Layer (Transparenz, zechnen)
 
Der Canvas ist ja die "Leinwand", auf die man zeichnet, und ist das nicht ein wenig unsinnig, auf eine durchsichtige Leinwand zu zeichnen bzw. die leinwand durchsichtig zu machen? Ich würde die Leinwand eben einfach komplett weiß halten und nur auf die layer zeichnen.

simlei 30. Mai 2006 18:21

Re: Graphics32 - Layer (Transparenz, zechnen)
 
Ich will die Leinwand ja nicht komplett durchsichtig machen ...
Ich will zB den Alphawert so auf halbtransparent (~130) setzen, und mein Problem ist nun, dass das Image32.Bitmap nicht solche Sachen wie Rect(), Ellipse(), Polygon() ...l kann, die das normale TCanvas kann, dieses wiederum kann dafür keine Transparenz. Da aber Image32.Bitmap.Canvas existiert, dachte ich nun, da das Canvas hier dem Bitmap untergeordnet ist, dass alles, was auf dem Canvas gezeiochnet ist, auch dem MasterAlpha des Bitmap "gehorcht". Dies ist nun offensichtlich nicht der Fall. Die Frage ist nun, wie ich auch die auf dem Image32.Bitmap.Canvas gezeichneten Sachen transparent mache, und zwar nach dem Image32.Bitmap.MasterAlpha.

DGL-luke 31. Mai 2006 16:54

Re: Graphics32 - Layer (Transparenz, zechnen)
 
also du könntest die zuerst "offline" zeichnen und dann transparent reinkopieren. Ich hoffe doch, man kann irgendwo clwhite als Transparenz zum Kopieren einstellen.

Wenns wirklich dicke kommt, halt ne for-for-Schleife mit Pixel[x,y]<>clwhite-Bedingung zum Kopieren. :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz