AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Graphics32 - Layer (Transparenz, zechnen)
Thema durchsuchen
Ansicht
Themen-Optionen

Graphics32 - Layer (Transparenz, zechnen)

Ein Thema von simlei · begonnen am 17. Mai 2006 · letzter Beitrag vom 2. Jun 2006
Antwort Antwort
Seite 1 von 2  1 2      
simlei

Registriert seit: 23. Nov 2005
119 Beiträge
 
Delphi 7 Professional
 
#1

Graphics32 - Layer (Transparenz, zechnen)

  Alt 17. Mai 2006, 19:33
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!!
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.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Graphics32 - Layer (Transparenz, zechnen)

  Alt 17. Mai 2006, 19:38
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
simlei

Registriert seit: 23. Nov 2005
119 Beiträge
 
Delphi 7 Professional
 
#3

Re: Graphics32 - Layer (Transparenz, zechnen)

  Alt 17. Mai 2006, 19:42
Naja.. mit der habe ich ja gerade mal das geschafft, was hier zu lesen ist
oder hat jmd. ein gutes tut? das wär noch besser!
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Graphics32 - Layer (Transparenz, zechnen)

  Alt 18. Mai 2006, 04:42
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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
simlei

Registriert seit: 23. Nov 2005
119 Beiträge
 
Delphi 7 Professional
 
#5

Re: Graphics32 - Layer (Transparenz, zechnen)

  Alt 18. Mai 2006, 10:14
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?
  Mit Zitat antworten Zitat
moonwhaler

Registriert seit: 22. Dez 2005
57 Beiträge
 
Delphi 5 Enterprise
 
#6

Re: Graphics32 - Layer (Transparenz, zechnen)

  Alt 18. Mai 2006, 10:38
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:

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...
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Graphics32 - Layer (Transparenz, zechnen)

  Alt 19. Mai 2006, 00:56
Zitat von simlei:
per mylayer.Location kann die Position festgelegt werden.
Und ich such mich krümmelig danach... Wieder was gelernt

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.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Graphics32 - Layer (Transparenz, zechnen)

  Alt 19. Mai 2006, 14:58
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
simlei

Registriert seit: 23. Nov 2005
119 Beiträge
 
Delphi 7 Professional
 
#9

Re: Graphics32 - Layer (Transparenz, zechnen)

  Alt 30. Mai 2006, 18:21
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.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Graphics32 - Layer (Transparenz, zechnen)

  Alt 31. Mai 2006, 16:54
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz