Autor Beitrag
Lurnon
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 33



BeitragVerfasst: Di 19.09.06 13:47 
Hallo,
hier gibts mal wieder ne neue Frage von mir, damit euch nicht langweilig wird.

Problem ist folgendes, ich will ein TBitMap in ein TImage zeichen (was ich wie es geht), nur möchte ich das er die Pixel des Bildes vorher auf eine bestimmte Farbe kontrolliert und falls diese dabei ist, den betreffenden Pixel nicht malt.

Danke im Vorraus,

Lurnon
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 19.09.06 18:08 
Guck dir mal TransparentColor und Transparent des TBitmaps an.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Lurnon Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 33



BeitragVerfasst: Di 26.09.06 13:18 
So hab mich jetzt eine Woche mit dem Problem rumgequält und habe es nicht hinbekommen. Daher hoffe ich auf weitere Hilfe. Falls es wichtig sein sollte ich benutze den Befehl bitblt zum einfügen und der muss auch erhalten bleiben.

Danke mal wieder im vorraus
Lurnon
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Di 26.09.06 13:24 
Du musst die Eigenschaft Transparent des Images auf true setzten. TransparentColor erhält die Farbe, die herausgefiltert werden soll. Zeig mal den BitBlt-Aufruf.
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Di 26.09.06 13:31 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  Image1.Picture.Bitmap := TBitmap.Create;
  Image1.Picture.Bitmap.Width := ???;
  Image1.Picture.Bitmap.Height := ???;
  Image1.Picture.Bitmap.Transparent := true;
  Image1.Picture.Bitmap.TransparentColor := clBlack;
  Image1.Transparent := true;
  // Hier kommt der BitBlt-Aufruf auf Image1.Picture.Bitmap
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Di 26.09.06 14:33 
Image.Transparent:= True??????
Wenn ich mich recht entsinne möchte er nur etwas transparent Zeichnen und nicht das Ziel transparent darstellen.

BitBlt ist außerdem ein direkter Windows API Aufruf. Zum Verständniss. Ein TBitmap überprüft beim Zeichnen die Eigenschaft Transparent und ruft dann entsprechend den Befehl TransparentStretchBlt oder StretchBlt auf. Normalerweise interessiert sich ein Windows API Aufruf nicht für irgendwelche Eigenschaften einer Delphi Klasse. Mag sein, dass es durch Randeffekt manchmal doch zu Effekten kommt die im Resultat dann auch so aussehen würden.

Nach meiner Meinung hast du 2 Möglichkeiten.

Entweder du benutzt die Schnittstellen der VCL. Also Canvas.Draw(X, Y, BMP). Was aber mitunter nicht immer das Schnellste ist. Dafür aber alles recht anständig gekappselt und wenn es nicht gerade auf jedes noch kleine bisschen Performance ankommt durchaus akzeptabel.

Oder aber du benutzt den Befehl Suche im MSDN TRANSPARENTBLT. Der sieht so ähnlich aus wie BitBlt nur, dass du noch eine SrcWidth, SrcHeight und eine Farbe angeben musst.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Di 26.09.06 14:35 
du könntest mittels Canvas.Scanline jedes Pixel in dem bmp überprüfen und wenn du es nicht magst ersetzt du es einfach mit einem Pixel deiner Wahl!

lg mike

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Di 26.09.06 14:38 
Es gibt immer einen noch komplizierteren Weg. Findest du nicht, dass es für ein einfaches ColorKey Verfahren nicht ein bisschen zu überzogen ist?

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Di 26.09.06 14:41 
wenn man aber folgende Farben nicht haben will: [20,25,255] und [25,20,255] kann man das nichtmehr nur mit TransperantColor machen oder? weil TransperatColor nur eine Farbe haben will. d.h. man muss alle nicht erwünschten Farben auf eine Reduzieren und dann TransperantColor auf diese eine Farbe setzen, oder?

lg el

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Di 26.09.06 14:49 
Das wäre eine Möglichkeit. Wobei der Idealfall natürlich wäre, dass so etwas von Hause aus schon nicht auftreten sollte. Aber das ist ein anderes Thema.

Aber auch dafür hat die GDI eine Lösung. Suche im MSDN MASKBLT. Bekommt ein Monochromes Bitmap übergeben bei welchem alle transparenten Pixel schwarz sind. So würdest du nicht in die Verlegenheit kommen etwas am Originalbild verändern zu müssen.

Aber ich glaube schweift ein ganz kleines bisschen ab. ;-)

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Lurnon Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 33



BeitragVerfasst: Mi 27.09.06 16:23 
Danke an alle die geantwortet haben. TRANSPARENTBLT war die gesuchte Lösung meines Problems.


Lurnon