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
Kroko 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
Kroko 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
Yogu 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 Kroko 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
Kroko 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; Image1.Picture.bitmap.Assign(B); 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
Kroko 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
Freiberger 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
Kroko 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!!!!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!