AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Bild auf Bild kopieren/übermalen & Transparenz
Thema durchsuchen
Ansicht
Themen-Optionen

Bild auf Bild kopieren/übermalen & Transparenz

Ein Thema von Cyberaxx · begonnen am 15. Jun 2012 · letzter Beitrag vom 16. Jun 2012
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.590 Beiträge
 
Delphi 12 Athens
 
#1

AW: Bild auf Bild kopieren/übermalen & Transparenz

  Alt 15. Jun 2012, 10:10
Dein Button-Bild übermalt eben nur da, wo es auch was zu malen hat. An transparenten Stellen malt es eben nichts hin.
Du mußt also das ganze Bild vorher leer machen oder eine Neues nehmen, wo dann der Button draufgemalt wird.

Oder lade das Button-Bild in das angezeigt Image, anstatt es draufzumalen.
Also nur die Zahl wird gemalt, vorher das Button-Bild wird geladen und damit alles Alte überschrieben übermalt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (15. Jun 2012 um 10:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Bild auf Bild kopieren/übermalen & Transparenz

  Alt 15. Jun 2012, 10:50
Ich bastle mir für so etwas gerne eigene Komponenten auf Basis von TGraphicControl mit GDI +,
da Du JvImage verwenden möchtest, was ich meinte geht in diese Richtung, kann durchaus noch Fehler beinhalten.
(Annahme Imagelisten mit 32-Bit , PNG's)

Delphi-Quellcode:
function CombineIcons(FrontIcon, BackIcon: HIcon): HIcon;
// von http://www.swissdelphicenter.ch/torry/showcode.php?id=1636
var
  WinDC: HDC;
  FrontInfo: TIconInfo;
  FrontDC: HDC;
  FrontSv: HBITMAP;
  BackInfo: TIconInfo;
  BackDC: HDC;
  BackSv: HBITMAP;
  BmpObj: tagBitmap;
begin
  WinDC := GetDC(0);

  GetIconInfo(FrontIcon, FrontInfo);
  FrontDC := CreateCompatibleDC(WinDC);
  FrontSv := SelectObject(FrontDC, FrontInfo.hbmMask);
  GetIconInfo(BackIcon, BackInfo);
  BackDC := CreateCompatibleDC(WinDC);
  BackSv := SelectObject(BackDC, BackInfo.hbmMask);
  GetObject(FrontInfo.hbmMask, SizeOf(BmpObj), @BmpObj);
  BitBlt(BackDC, 0,0,BmpObj.bmWidth, BmpObj.bmHeight, FrontDC, 0,0,SRCAND);
  SelectObject(BackDC, BackInfo.hbmColor);
  DrawIconEx(BackDC, 0,0,FrontIcon, 0,0,0,0,DI_NORMAL);
  Result := CreateIconIndirect(BackInfo);
  SelectObject(FrontDC, FrontSv);
  DeleteDC(FrontDC);
  SelectObject(BackDC, BackSv);
  DeleteDC(BackDC);
  ReleaseDC(0,WinDC);
  DeleteObject(FrontInfo.hbmColor);
  DeleteObject(FrontInfo.hbmMask);
  DeleteObject(BackInfo.hbmColor);
  DeleteObject(BackInfo.hbmMask);
end;

procedure TForm5.SetButton(Picture:TPicture;ButtonList,ZahlenList:TImageList;ButtonIndex:Integer;StateIndex:Integer);
  var
   ico,ico2,ico3:TIcon;
   c:TMetafileCanvas;
  begin
      ico := TIcon.Create;
      ico2 := TIcon.Create;
      ico3 := TIcon.Create;
      try
       ButtonList.GetIcon(ButtonIndex,ico);
       if StateIndex>0 then
          begin
            ZahlenList.GetIcon(StateIndex,ico2);
            ico3.Handle := CombineIcons(ico2.Handle,ico.Handle);
            Picture.Assign(ico3);
          end else Picture.Assign(ico);
      finally
        ico.Free;
        ico2.Free;
        ico3.Free;
      end;

  end;

procedure TForm5.FormCreate(Sender: TObject);
begin
   SetButton(JVImage1.Picture,ImageButtons,ImageZahlen,0,1);
   SetButton(JVImage1.Pictures.PicEnter,ImageButtonsHoover,ImageZahlen,0,1);
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Bild auf Bild kopieren/übermalen & Transparenz

  Alt 15. Jun 2012, 11:24
Das ist auch eine nette Funktion. An Imagelisten habe ich noch nicht gedacht gehabt.
Später ist es so das alle Icons/Buttons in einem Archive sind und dementsprechend draus
geladen werden um nicht so viel in die EXE zu packen.

Das Anzeigen selbst klappte ja bisher auch. Nur das übermalen hat ja nicht geklappt.
Hatte mir da nun etwas zusammen geschustert.
Dazu habe ich dann aber noch eine Frage.

Delphi-Quellcode:
  var
    MStream: TMemoryStream;
begin
  try
    MStream := TMemoryStream.Create;
    MStream.Position := 0;
    ButtonImage.SaveToStream(MStream);
    MStream.Position := 0;
    JvImage1.Picture.Bitmap.LoadFromStream(MStream);
  finally
    MStream.Free;
  end;
Ich habs, da ich den letzten Beitrag noch nicht gesehen hatte, dem Tip von Himitsu zu folgen.
Da müsste ich doch richtig in der Annahme gehen, ich speicher das Originalbild in den Stream und lade es von dort aus aufs JvImage. Nur leider wird dann nichts mehr angezeigt.

Wenn ich nun aber
JvImage1.Picture.Bitmap.Canvas.Draw(0,0, ButtonImage); noch zusätzlich einfüge wirds normal dargestellt aber... ich versteh da scheinbar gerade etwas nicht.


@Bummi Na die JvImage Komponente bietet so ja schon alles was ich brauche. Bilder für mehrere Modis ohne groß etwas eigentsändiges zu entwickeln. War dadurch die erste Wahl.
Ich Bastel da mal ein wenig rum
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Bild auf Bild kopieren/übermalen & Transparenz

  Alt 15. Jun 2012, 11:50
irgend etwas ist bei uns unterschiedlich konfiguriert.

das von Dir beschriebene

Zitat:
JvImage1.Picture.Bitmap.Canvas.Draw(0,0, ButtonImage);
funktioniert bei mir nicht, da dort PNG's zugeordnet wurden, wenn man direkt JvImage1.canvas zugreift kommt es dann auch zu der erwarteten Fehlermeldung.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:44 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