AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bild Pixel für Pixel / Byte für Byte "zeichnen"
Thema durchsuchen
Ansicht
Themen-Optionen

Bild Pixel für Pixel / Byte für Byte "zeichnen"

Ein Thema von hirnstroem · begonnen am 25. Jan 2007 · letzter Beitrag vom 26. Jan 2007
Antwort Antwort
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#1

Bild Pixel für Pixel / Byte für Byte "zeichnen"

  Alt 25. Jan 2007, 12:10
'loha Folks,

ich wollte mich erkundigen, wie man eine Grafik aus einzelnen Pixeln zusammensetzt.

Ich bekomme von einem Gerät, welches an einen CAN-Bus angeschlossen ist ein Bild zugeschickt. Die Bilddaten, welche ich erhalte sehen z.B. so aus:

2103010000050026 // erstes Byte des Headers
0700000023020026 // zweites Byte des Headers
FF00FF00FF00FF00 // Bilddaten
FF00FF00FF00FF00 // "
FF00FF00FF00FF00 // "
FF00FF00FF00FF00 // "
FF7B7B7B7B7B7B7B // " + bit gestuffe

Aus dem Header kann ich die Höhe und Breite des (momentan unkomprimierten) Bildes entnehmen.

Die Restlichen Daten (im Beispiel die FFs und 00s) stellen die Farbe des jeweiligen Pixels (1 Byte = 1 Farbe) dar. Abgeschlossen wird das Ganze durch Füllbits (im Beispiel die 7Bs), welche mich erkennen lassen, dass keine weiteren Bilddaten mehr folgen.

Nun habe ich also einen ganzen Rattenschwanz an Bilddaten (FFs und 00s), welche nun nacheinander das jeweilige Pixel des Bildes füllen sollen. Aber wie dies geht ist mir z.Z. noch ein Rätsel.

Grüsse
hirnstroem
inde deus abest
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#2

Re: Bild Pixel für Pixel / Byte für Byte "zeichnen"

  Alt 25. Jan 2007, 12:13
Ich würde erstmal versuchen, das ganze über einen File- oder Memory-Stream
zu sammeln und auf die Platte zu schreiben. Vielleicht kommt ja eine
valide Windows-Bitmap raus, hab k.A. wie der Header auszusehen hat ^^"

Edit:
Ansonsten dann halt eine TBitmap-Instanz erzeugen und die Höhe und Breite
setzen. Dann die Pixel durchgehen und deren Farbe entsprechend setzen.
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Bild Pixel für Pixel / Byte für Byte "zeichnen"

  Alt 25. Jan 2007, 13:10
Zitat von H4ndy:
Ich würde erstmal versuchen, das ganze über einen File- oder Memory-Stream
zu sammeln und auf die Platte zu schreiben. Vielleicht kommt ja eine
valide Windows-Bitmap raus, hab k.A. wie der Header auszusehen hat ^^"

Edit:
Ansonsten dann halt eine TBitmap-Instanz erzeugen und die Höhe und Breite
setzen. Dann die Pixel durchgehen und deren Farbe entsprechend setzen.
Ich würde genau das Edit machen. Mal schauen was funktioniert
-TBitmap.canvas.pixels[a,b]:=Tcolor;
-oder nonVCL über createBitmap
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Bild Pixel für Pixel / Byte für Byte "zeichnen"

  Alt 25. Jan 2007, 13:22
ahh, warum so kompliziert. Einfach ein TBitmap erstellen, die Farbtiefe setzen, mit Scanline einen Pointer auf die letzte Zeile holen und da die gesamten Daten rein schreiben. Dabei natürlich beachten das die Zeile an 32bit ausgerichtet ist und somit gegebenfalls einige Bits ungenutzt bleiben pro zeile.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Bild Pixel für Pixel / Byte für Byte "zeichnen"

  Alt 25. Jan 2007, 13:36
Das überfordert nun meine Delphi-Skills ein wenig.

Delphi-Quellcode:
  Picture := TBitmap.Create;
  Picture.Width := PictureWidth;
  Picture.Height := PictureHeight;
  Picture.PixelFormat := pf8bit;
Bis hierhin ist mir die Geschichte noch klar.

Wie kann ich jetzt z.B. das erste Pixel eines 5 x 7 Pixel "grossen" Bildes mit der Information 'FF' oder '00' versehen?
inde deus abest
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Bild Pixel für Pixel / Byte für Byte "zeichnen"

  Alt 25. Jan 2007, 13:40
mit
Bitmap.Scanline[Bitmap.Height - 1] bekommst du einen Pointer auf die letzte Zeile. Bitmaps sind so aufgebaut das im Speicher erst die letzte Zeile steht, dann die vorletzte, dann die 3letzte etc.
Das heißt du musst zu dieser Adresse 2 Zeilenlängen addieren um an den Anfang der ersten Zeile zu gelangen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Bild Pixel für Pixel / Byte für Byte "zeichnen"

  Alt 25. Jan 2007, 14:03
edit: >.< dummheit, hab den post nich richtig gelesen >.< sry...
  Mit Zitat antworten Zitat
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Bild Pixel für Pixel / Byte für Byte "zeichnen"

  Alt 26. Jan 2007, 12:33
Vielen Dank so weit. Das Bild sieht schon mehr oder weniger so aus wie es soll. Aber die einzelnen Pixel scheinen jeweils um ein Paar Positionen verschoben zu sein.

Delphi-Quellcode:
  PictureWidth := 5;
  PictureHeight := 7;
  PixelBytes := 'FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF'
^^ so sieht die Situation beispielsweise aus bevor das Bild aufgebaut wird. In PixelBytes sind 35 Pixel gespeichert, welche ein 7x5 Pixel grosses Bild mit einem Schachbrettmuster ergäben. Die Bytes in PixelBytes sind so angeordnet, dass das erste den oberen rechten Pixel des Bildes und das letzte den Pixel unten Links im Bild darstellen. Mit dem nachfolgenden Code wird nun von hinten her jedes Pixel geschrieben:

Delphi-Quellcode:
for k := 0 to PictureHeight - 1 do
begin
  Pixel := Picture.ScanLine[k];
  for l := 0 to PictureWidth - 1 do // row manipulation
  begin
    with Picture do
    begin
      Color := HexStrToInt(Copy(PixelBytes, Length(PixelBytes) - 1, 2));

      if Color = 255 then Color := 125; // nur damit ich weisse Pixel auch sehe

      Pixel^.rgbtRed := Color;
      Pixel^.rgbtGreen := Color;
      Pixel^.rgbtBlue := Color;

      PixelBytes := Copy(PixelBytes, 0, Length(PixelBytes) - 2);
      Inc(Pixel);
    end;
  end;
end;
Picture.SaveToFile(IntToStr(k) + '.bmp');
Nun erwarte ich eigentlich nach dem speichern des Bildes, dass dieses in etwa so aussieht (x = weiss, - = schwarz):

x-x-x-x
-x-x-x-
x-x-x-x
-x-x-x-
x-x-x-x
-x-x-x-
x-x-x-x

Heraus kommt aber folgendes:

x---x
-xxx-
x---x
-xxx-
x---x
-xxx-
---xx

Und das gefällt mir nicht.
inde deus abest
  Mit Zitat antworten Zitat
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Bild Pixel für Pixel / Byte für Byte "zeichnen"

  Alt 26. Jan 2007, 12:34
*kreuzsternrautetotenkopffluch*

Ich habe die Farbtiefe (PixelFormat) auf 8 bit anstatt 32 bit eingestellt. Mit 32 Bit kommt die Sache richtig raus.
inde deus abest
  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 01:40 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