![]() |
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. |
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. |
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! |
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 |
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 |
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:
Der Aufruf ist sehr einfach: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;
Delphi-Quellcode:
Bei MouseEnter beim entsprechenden TImage32 dann folgendes:
ImageAlpha( lock_image_bg, icon_list.Bitmaps[0].Bitmap );
Delphi-Quellcode:
Und bei MouseLeave:if ( Sender is TImage32 ) then with Sender as TImage32 do TBitmapLayer( Layers[0] ).Bitmap.MasterAlpha := 255;
Delphi-Quellcode:
Lässt sich natürlich beliebig ausbauen... :)if ( Sender is TImage32 ) then with Sender as TImage32 do TBitmapLayer( Layers[0] ).Bitmap.MasterAlpha := 100; |
Re: Graphics32 - Layer (Transparenz, zechnen)
Zitat:
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. |
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.
|
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. |
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. |
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