Entwickler-Ecke

Multimedia / Grafik - Pixelfarbe bleibt -1 bei Image


Herr Bananerama - Do 14.02.08 20:31
Titel: Pixelfarbe bleibt -1 bei Image
Hallo erstmal

Ich weiß das Thema gabs hier schonmal aber es wurde nicht wirklich geklärt. Und bei mir tritt jetzt das gleiche Problem auf!!!

Hier mein Code:

Delphi-Quelltext
1:
 if   (Canvas.Pixels[k,l]) <> clWhite then  begin Result := false;  exit end                    


Wenn Zur Laufzeit Zeigt Pixels immer -1 an !!!


Kroko - Do 14.02.08 20:36

Was für ein Canvas?


Marc. - Do 14.02.08 20:38

Ist k eine Laufvariable? Wie schaut Dein Bild aus? Etwas mehr Infos wären recht angebracht.

edit: Das ist ja ein "L" und keine Eins. Dein Bild ist nicht vollständig weiß? Hatte den Code erst aus Müdigkeit falsch interpretiert. :?


Herr Bananerama - Do 14.02.08 20:45

Ouh Schuldigung hab die Details vergessen:


Das Canvas ist von einem TImage und auf diesem wurde gezeichnet. k und l sind lokale Integer Variablen. Ich möchte damit prüfen ob der Pixel[k,l] nicht die Farbe clWhite hat.


Kroko - Do 14.02.08 20:46

Teste mal


Delphi-Quelltext
1:
Image.Picture.Bitmap.Canvas[...]                    


Herr Bananerama - Do 14.02.08 20:56

user profile iconKroko hat folgendes geschrieben:
Teste mal


Delphi-Quelltext
1:
Image.Picture.Bitmap.Canvas[...]                    


Danach klappt es immernoch nicht.


Yogu - Do 14.02.08 20:57

Der Canvas des Images ist immer abhängig davon, ob dein Fenster gerade angezeigt wird. Diese Zeichenfläche solltest du deshalb lieber nicht abfragen, sondern - wie user profile iconKroko bereits erwähnte - etwas weiter reingehen.

Es reicht aber, wenn du auf Image1.Picture.Graphic zugreifst, diese Grafik ist auch verfügbar, wenn du keine Bitmap hast.


Herr Bananerama - Do 14.02.08 21:15

user profile iconYogu hat folgendes geschrieben:
Der Canvas des Images ist immer abhängig davon, ob dein Fenster gerade angezeigt wird. Diese Zeichenfläche solltest du deshalb lieber nicht abfragen, sondern - wie user profile iconKroko bereits erwähnte - etwas weiter reingehen.

Es reicht aber, wenn du auf Image1.Picture.Graphic zugreifst, diese Grafik ist auch verfügbar, wenn du keine Bitmap hast.


Wenn ich Image1.Picture.Graphic.Canvas.Pixels mache dann meckert der Compiler und beschimpft Canvas und Pixels als undefinierten Bezeichner. Oder habe ich das falsch verstanden???


Kroko - Do 14.02.08 21:16

(a) Graphic hat imho keine Canvas
(b) Was hast Du denn für ein Bildformat geladen (bmp jpg etc)?


Herr Bananerama - Do 14.02.08 21:28

user profile iconKroko hat folgendes geschrieben:
(a) Graphic hat imho keine Canvas
(b) Was hast Du denn für ein Bildformat geladen (bmp jpg etc)?



Wie gesagt ich hab auf das Image gezeichnet mit LineTo und so !!! Kein Bild!!! Sorry wenn das nicht klar geworden ist, aber ich dachte wenn ich sage zeichnen ... naja tut mir leid


Kroko - Do 14.02.08 21:31

Dann erstelle eine Bitmap

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var
  B: TBitmap;
begin
  B := TBitmap.Create;
  B.Width := 400;
  B.Height := 300;
  B.PixelFormat := pf24Bit;
  //
  // zeichnen
  //
  Image1.Picture.bitmap.Assign(B);
  //
  // test mit B.Canvas.Pixels
  B.Free;
end;


Herr Bananerama - Do 14.02.08 21:44

Ich hab das zeichnen in anderen proceduren und das muss auch in anderen proceduren sein ... und zwar in mehreren. Wenn ich in jeder das mache was du geschrieben hast sieht man nurnoch ein Weißes Image auf dem eigentlich ein Auto zu sehen sein sollte. ;)

Zeichnen muss man auf das Canvas von der Bitmap also b.Canvas? Also so hab ichs gemacht.


Kroko - Do 14.02.08 21:47

(a) entweder zu zeigst mehr Quellen oder
(b) erstelle das Bitmap als Variable der Form, dann kannst in allen Form-Prozeduren auf das Bitmap zugreifen


Herr Bananerama - Do 14.02.08 21:57

Ist doch kein weißes Bild mehr ... hatte einen kleinen unwichitigen Fehler. Ich könnte Hier kaum den ganzen Code eingeben weil der Recht Umfangreich ist aber hier mal zumindest die ganze procedure:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function TAuto.VorneFreiImg;
var i,j,k,l: Integer;
begin
  Result := true;
  if (Top < ( H.Top + H.Height ))
     and (( Top + Height) > H.Top )
     and (( Left + Width) > H.Left )
     and ( Left < ( H.Left + H.Width )) then
      For i := h.Top To (h.Top + h.Height) do
        For j := h.Left to (h.Left + h.Width) do
          For k :=  Left to (Left + Width) do
            For l := Top To (Top + Height) do
              if (i = l) and (k = j) then
                if  ( Picture.Bitmap.Canvas.Pixels[ k,l]) <>  clwhite then begin 
                  Result  := false;   exit end
end;


ist eine Prozedure um zu gucken ob sich ein Hindernis vor hinter oder neben dem Auto befindet. TAuto ist abgeleite von TFahrzeug. TFahrzeug von TImage. Übrigens Danke das ihr/du vorallem Kroko eu so bemüht!


Kroko - Do 14.02.08 22:02

Überdenke mal Dein Konzept, sonst bekommst Du Geschwindigkeitsprobleme und anderes ohne Ende, die Proc ist der Hammer, :wink:


Freiberger - Do 14.02.08 22:12

schonmal mit scanline versucht ? ist wesentlich schneller...


Herr Bananerama - Do 14.02.08 22:12

user profile iconKroko hat folgendes geschrieben:
Überdenke mal Dein Konzept, sonst bekommst Du Geschwindigkeitsprobleme und anderes ohne Ende, die Proc ist der Hammer, :wink:


Ich hatte hier schonmal gefragt wie das anders geht aber es kam kein vorschlag außer irgendwelche wo man nur die Rects auf Kolision prüft. Aber ich hab in dem image ein Auto das sich dreht deswegen kann ich das nicht gebrauchen ;). Übrigens das Problem ist immernoch da. dat is zum Kotzen ^^ :puke:


Herr Bananerama - Do 14.02.08 22:18

user profile iconFreiberger hat folgendes geschrieben:
schonmal mit scanline versucht ? ist wesentlich schneller...


Wie meinst du das mit Scanline?


Freiberger - Do 14.02.08 22:22

suche mal im Forum nach scanline.
damit wird das Bild über einen Pointer abgefragt.

Mit scanline mach man schnelle Grafikroutinen, zb spiegeln, in Graustufen umwandeln oä.

Damit kannst du auch sehr schnell die Farbe eines Pixels abfragen


Yogu - Do 14.02.08 22:22

Delphi-Online-Hilfe:


ScanLine (Eigenschaft von TBitmap)

Die Eigenschaft ScanLine ermöglicht einen indizierten, zeilenweisen Zugriff auf Pixel.

Delphi-Syntax:
property ScanLine[Row: Integer]: Pointer;

Beschreibung
ScanLine wird nur bei DIBs (Device Independent Bitmaps) für Bildbearbeitungsprogramme verwendet, die Low-Level-Operationen auf Pixelebene durchführen.


Freiberger - Do 14.02.08 22:32

hier mal ein Beispiel aus dem Delphi-Easy-Helper...
Vielleicht hilf das ja weiter.

Bei der Invention eines Bitmaps werden alle Farbwerte umgekehrt, so dass es aussieht, als hätte man ein Negativ vor sich.

Zuerst ist diese Typenvereinbarung erforderlich:

type
TFarbArray = array[0..0] of TRGBTriple;
pFarbArray = ^TFarbArray;
Dann kommt die Inventieren-Prozedur:

procedure Inventieren(const Bitmap: TBitmap);
var
i,j:Integer; Reihe: ^TRGBTriple;
begin
for i:= 0 to Bitmap.Height-1 do
begin
Reihe:= Bitmap.Scanline[i];
for j:= 0 to Bitmap.Width-1 do
begin
Reihe^.rgbtred := not Reihe^.rgbtred;
Reihe^.rgbtBlue := not Reihe^.rgbtblue;
Reihe^.rgbtgreen := not Reihe^.rgbtgreen;
inc(Reihe);
end;
end;
bitmap.Assign(Bitmap);
end;
Die erste Schleife geht jedes Pixel in der Höhe durch, die Zweite jedes in der Breite. Dann wird jeder Fabwert mit dem not-Operator umgekehrt.

Über die Scanline-Funktion bietet das Internet ausreichend erklärenden Stoff.

Der Aufruf dieser Prozedur ist selten einfach:

procedure TForm1.Button1Click(Sender: TObject);
begin
Inventieren(Image1.Picture.Bitmap);
end;


Herr Bananerama - Do 14.02.08 23:16

Ich probiers mal aus


Kroko - Fr 15.02.08 07:43

(a) Wenn Du meine Tipp mit dem Bitmap beherzigt hast, sollte das Problem aus der Wlet sein, es sei denn, Deine Koodinaten X,Y stimmen nicht und liegen au0erhalb des Bitmap-Bereichs, dann kommt Color=-1
(b) Dein Auto ist ein Viereck(Polygon) in der Ebene, Dein Hindernis ist ein Viereck(Polygon) in der Ebene, also einfach testen, ob ein Eckpunkt des Hinderniss im Viereck(Polygon) des Autos liegt
(c) lasse das Image ganz weg, zeichne alles auf ein Bitmap und gibt diese direkt per BitBlt auf dem Canvas der Form bzw in einer PaintBox aus!


Herr Bananerama - Fr 15.02.08 16:39

user profile iconKroko hat folgendes geschrieben:
(a) Wenn Du meine Tipp mit dem Bitmap beherzigt hast, sollte das Problem aus der Wlet sein, es sei denn, Deine Koodinaten X,Y stimmen nicht und liegen au0erhalb des Bitmap-Bereichs, dann kommt Color=-1
(b) Dein Auto ist ein Viereck(Polygon) in der Ebene, Dein Hindernis ist ein Viereck(Polygon) in der Ebene, also einfach testen, ob ein Eckpunkt des Hinderniss im Viereck(Polygon) des Autos liegt
(c) lasse das Image ganz weg, zeichne alles auf ein Bitmap und gibt diese direkt per BitBlt auf dem Canvas der Form bzw in einer PaintBox aus!


Es Funktioniert jetzt alles wunderbar und ich brauch jetzt auch nurnoch 2 variablen und 2 For-Schleifen. Der Tipp mit Scanline war echt Hilfreich. Danke für eure Hilfe!!!!