Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Transparentfarbe aus Pixelposition im Bild (https://www.delphipraxis.net/74303-transparentfarbe-aus-pixelposition-im-bild.html)

Moony 1. Aug 2006 09:47


Transparentfarbe aus Pixelposition im Bild
 
Hallo zusammen,

wie schon der Titel besagt, möchte ich meine Transparentfarbe auf das Bld abstimmen. Dafür benötige ich die Farbe des Bildes von von einer bestimmten Position. Dies habe ich folgendermaßen versucht:

Delphi-Quellcode:
TImage.Picture.Bitmap.TransparentColor := TImage.Picture.Bitmap.Canvas.Pixels[1,1];
Ich möchte also nach diesen Angaben den oberen, linken Pixel als Transparentfarbe verwenden, deshalb die Angabe von 1,1. Leider liefert mir die Pixels-Funktion den Wert -1 zurück.

Ich hoffe mir kann da jemand weiterhelfen.

Gruß, Moony

freak4fun 1. Aug 2006 09:55

Re: Transparentfarbe aus Pixelposition im Bild
 
Delphi-Quellcode:
Image1.Picture.Bitmap.TransparentColor := Image1.Picture.Bitmap.Canvas.Pixels[1,1];
Viellleicht so? Also mit dem erstellten Objekt.

Moony 1. Aug 2006 09:58

Re: Transparentfarbe aus Pixelposition im Bild
 
Damit mache ich das auch....Ich mache das ja nicht mit dem Objekttyp sondern mit dem erstellten Objekt.

himitsu 1. Aug 2006 10:18

Re: Transparentfarbe aus Pixelposition im Bild
 
eventuell so ... vorallem tmFixed ist wichtig :)
Delphi-Quellcode:
// kann man auch im OI instellen
Image1.Transparent := True;
// wird wohl auch gleich über das Image mit umgestllt
Image1.Picture.Bitmap.Transparent := True;
// wichtig, wenn du selber die farbe bestimmen willst
Image1.Picture.Bitmap.TransparentMode := tmFixed;
// tja, halt deine Farbe ^^
Image1.Picture.Bitmap.TransparentColor := ...;

Moony 1. Aug 2006 10:23

Re: Transparentfarbe aus Pixelposition im Bild
 
Das mit dem Tranparentmode hab ich auch schon probiert, wobei das eigentlich überflüssig ist, da sobald eine Farbe festgelegt wird sich der Mode automatisch auf tmFixed ändert.

Was aber für mich wichtig ist, ist die Farbe von einem Pixel im Bild zu bekommen und dann zu setzen. Das heißt, ich möchte zum Bespiel aus dem Bld das geladen ist die Farbe des Pixels in der 2. Reihe, 5. Pixel erhalten. deshalb ja die Pixels-Funktion. aber diese liefert mir den Wert -1 zurück.

Flocke 1. Aug 2006 10:29

Re: Transparentfarbe aus Pixelposition im Bild
 
Links oben ist Canvas.Pixels[0,0] und nicht [1,1]. Vielleicht liegt dein Bildpunkt nicht in der Bitmap?

DGL-luke 1. Aug 2006 10:30

Re: Transparentfarbe aus Pixelposition im Bild
 
Pixels ist 0-indexed! Evtl. schlägst du ja erstmal auf ein 1x1-Bild, was natürlich nicht hinhaut... ansonsten sollte es eigentlich nie Fehlercodes zurückgeben, sondern Exceptions raisen...

Zitat:

Beachten Sie, dass die Eigenschaft Pixels nicht von jedem Gerätekontext unterstützt wird. Wenn der vorliegende Gerätekontext die Eigenschaft Pixels nicht unterstützt, gibt ein Lesezugriff den Wert -1 zurück. Die Zuweisung eines Wertes bleibt ohne Wirkung.
Ist dein Canvas evtl. gar nicht an einen Kontext gebunden?

Flocke 1. Aug 2006 10:34

Re: Transparentfarbe aus Pixelposition im Bild
 
Zitat:

Zitat von DGL-luke
... ansonsten sollte es eigentlich nie Fehlercodes zurückgeben, sondern Exceptions raisen...

GetPixel ruft einfach Windows.GetPixel auf, ohne jede Fehlerprüfung.

Zitat:

Zitat von DGL-luke
Ist dein Canvas evtl. gar nicht an einen Kontext gebunden?

Eine TBitmap benutzt an sich einen Memory-DC, der sollte das können.

P.S. @Moony: schöne Grüße aus Unna nach Kamen.

Moony 1. Aug 2006 10:57

Re: Transparentfarbe aus Pixelposition im Bild
 
@DGL-luke: An welchen Kontext sollte es denn gebunden sein. Ich rufe diese funktion über ein Imageobject auf. Ich will doch lediglich die Farbe eines bestimmten Pixels innerhalb des geladenen Objekts.

@Flocke: Grüße zurück.

Des Weiteren habe ich festgestellt, dass genau das gleiche Bild mit den fast gleichen Pixeleigenschaften überhaupt nicht berührt wird von der Transparenz!

mimi 1. Aug 2006 11:40

Re: Transparentfarbe aus Pixelposition im Bild
 
ich habe genau das gleich versucht und es hat mich tage gekostet um festzustellen das es an Tranzparentcolor liegt weil ich hatten ihn so zugewiesen wie du auch doch das klappte nicht.

Ich meine es liegt dran das die farben nicht 100%ig überein stimmen du musst irgenwie eine Tolleranz einbauen.
ich habe es so gelöst versuche mal folgenden code:

Delphi-Quellcode:
function collision(Bild1, Bild2:TBitMap; x1,y1,x2,y2:Integer):Boolean;
var
  sx,sy:Integer;
  test:Boolean;
  r1,r2,r3:TRect;
begin
  // Position vom zweiten objekt berechnen
  sx:=x2-x1; sy:=y2-y1;
  test:=False;
  r2.Left:=x2; r2.Top:=y2; r2.Right:=x2+bild2.Width; r2.Bottom:=y2+bild2.Height;
  r1.Left:=x1; r1.Top:=y1; r1.Right:=x1+bild1.Width; r1.Bottom:=y1+bild1.Height;
  if IntersectRect(r3,r1,r2) = True then begin
    if Bild1.Canvas.Pixels[sx,sy] = Bild1.Canvas.Pixels[1,1] then test:=False
    else test:=True;
  end;
  result:=Test;
end; // Collsion
das problem dabei ist jetzt nur noch das wenn du von oben kommst fehler kommen evlt. bekommst du eine lösung hin oder hast eine idee wie es gelöst werden könnte :-D

Hawkeye219 1. Aug 2006 12:03

Re: Transparentfarbe aus Pixelposition im Bild
 
Hallo Moony,
Zitat:

Zitat von Microsoft Platform SDK
If the pixel is outside of the current clipping region, the return value is CLR_INVALID.

Könnte das eine Erklärung sein?

Gruß Hawkeye

Moony 1. Aug 2006 12:04

Re: Transparentfarbe aus Pixelposition im Bild
 
Aber warum soll ich hier 2 Objekte übergeben? Ich hab doch nur ein Inageobjekt und will von diesem die Farbe ermiteln.

Moony 1. Aug 2006 12:09

Re: Transparentfarbe aus Pixelposition im Bild
 
@Hawkeye: Ich kann dir nicht sagen ob das dieser Wert ist. Ich bekommen -1 als Rückgabewert.

Hawkeye219 1. Aug 2006 13:03

Re: Transparentfarbe aus Pixelposition im Bild
 
Die Konstante ist in der Unit Windows.pas vereinbart:

Delphi-Quellcode:
CLR_INVALID = DWORD($FFFFFFFF);
Wenn man den Wert als Integer interpretiert, erhält man -1. Das GDI liefert den Wert, falls der abgefragte Pixel außerhalb des aktuellen Clippingbereichs liegt.
Versuche doch einmal, vor der Abfrage den Clippingbereich zurückzusetzen:

Delphi-Quellcode:
SelectClipRgn(Image1.Canvas.Handle, 0);
TransColor := Image1.Canvas.Pixels[1, 1];
Vielleicht erhältst du so den gewünschten Farbwert.

Gruß Hawkeye

Moony 1. Aug 2006 13:40

Re: Transparentfarbe aus Pixelposition im Bild
 
Das setzen des Clippingbreichs hilft lider auhc nichts....

DGL-luke 1. Aug 2006 14:54

Re: Transparentfarbe aus Pixelposition im Bild
 
Schieb das Bild mal rüber.

Moony 1. Aug 2006 16:41

Re: Transparentfarbe aus Pixelposition im Bild
 
Hat sich erledigt. Ich habe das Problem gelöst. Man muß auch die Transparenzfarbe setzen NACHDEM das Bild geladen wurde und NICHT vorher!!! :oops: Habe das in dem komplexen Wirrwarr nicht gesehen...

Danke für eure Hilfe. :thumb:

Gruß, Moony

mimi 2. Aug 2006 18:04

Re: Transparentfarbe aus Pixelposition im Bild
 
meins wahr für eine Collisions funktion gedacht, darum zwei objekte.....


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 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