Forum: Mikrocontroller und Digitale Elektronik Probleme beim Formatumwandeln von Bilddaten auf STM32746Disco


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von J. T. (chaoskind)


Bewertung
0 lesenswert
nicht lesenswert
MoinMoin,

irgendwie blick ich grad nich durch.... Folgende Situation:

Ich hab ein bmp-Bild von nem Online Gedöns in ein Array von 8bit/byte 
umwandeln lassen. Das hat auch super geklappt. Das Bild hat 12*65 Pixel 
zu je 8bit Rot, 8bit Grün und 8bit Blau.

Wenn ich dass Bild dann darstellen lasse, kommt auch genau das raus, was 
ich vorher in Paint gemalt hab.
1
  while (Y < 65)
2
  {
3
    while (X < 12)
4
    {
5
      BSP_LCD_DrawPixel(   X, Y, ( 0xFF000000 + (Bild_8b[i] << 16) + (Bild_8b[i+1] << 8) + (Bild_8b[i+2]) )   );
6
      X++;
7
      i +=3;
8
    }
9
    X = 0;
10
    Y++;
11
  }
12
  Y = 0;
13
  i = 0;


Nun lasse ich folgende Zeilen auf das Array los:
1
void Convert_8bTo32b(uint8_t *Bild_8b, uint32_t *Bild_32b, uint32_t Size)
2
{
3
  uint32_t i = 0;
4
  uint32_t X = 0;
5
6
  while (X < Size/4)
7
  {
8
    *( Bild_32b + X ) = ( 0xFF000000 + ( *(Bild_8b + i) << 16 ) + ( *(Bild_8b + i + 1) << 8 ) + ( *(Bild_8b + i + 2) ) );
9
    i += 3;
10
    X++;
11
  }
12
13
}

damit mir daraus ein Array von 32bit/"byte"-Werten gemacht wird. Weil 
wegen ARGB.

Wenn ich das 32bit-Array dann darstellen lasse:
1
  while (Y < 65)
2
  {
3
    while (X < 12)
4
    {
5
      BSP_LCD_DrawPixel(X, Y, (*(Bild_32b + (X*Y) + X )));
6
      X++;
7
    }
8
    X = 0;
9
    Y++;
10
  }
11
  Y = 0;

kommen höchst interesaante Muster bei raus, aber nicht mein kleines 
häßliches Männchen...

Bilder muss ich gleich extra anhängen, irgendwie will mein Handy grad 
nicht mit meinem Laptop reden ?!?!

Ich hab mir auch schon im SingleStep Modus die Arrays anzeigen lassen, 
die Konvertierung scheint so weit richtig zu sein, die ersten zig paar 
Werte und ein paar Stichproben haben jeweils richtige Werte ergeben.

Andrerseits hat mir das Konstrukt für die 32bit-Arrays bisher auch immer 
treue Dienste geleistet und nicht hübsche Muster gezaubert.

Findet jdm auf die Schnelle nen Fehler?
1
( 0xFF000000 + ( *(Bild_8b + i) << 16 ) + ( *(Bild_8b + i + 1) << 8 ) + ( *(Bild_8b + i + 2) ) );
und
1
(   X, Y, ( 0xFF000000 + (Bild_8b[i] << 16) + (Bild_8b[i+1] << 8) + (Bild_8b[i+2]) )   );
sollte doch die selben Elemente ansprechen/auslesen, wenn ich vorher den 
Pointer Bild_8bPt = &Bild[0] setze?

mit verwirrten Grüßen,
Chaos

von J. T. (chaoskind)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier die Bilder. Die Quali is eher Semideluxe... Aber schlechtes Licht, 
schlechte Kamera und winziges Bild auf dem Display, watt soll man tun.

P.S. es macht nicht interessante Muster, sondern immer das eine.

: Bearbeitet durch User
von J. T. (chaoskind)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal etwas besser, das Muster bzw das Foto von selbigem.

von J. T. (chaoskind)


Bewertung
0 lesenswert
nicht lesenswert
Schon ne Stunde online und 20 mal angeguckt und noch niemand hat sich 
über das viele Schwarz auf den Fotos beschwert. Ich bin beieindruckt

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Deine ganzen Index Aufrufe und Wandlungen geben für sich doch einzelne 
Werte zurück.
Die kannst du bevor du alle vereinigst einzeln prüfen,
dann zeigt sich ob es einen Unterschied macht.

von J. T. (chaoskind)


Bewertung
0 lesenswert
nicht lesenswert
pegel schrieb:
> Deine ganzen Index Aufrufe und Wandlungen geben für sich doch einzelne
> Werte zurück.
> Die kannst du bevor du alle vereinigst einzeln prüfen,
> dann zeigt sich ob es einen Unterschied macht

J. T. schrieb:
> Ich hab mir auch schon im SingleStep Modus die Arrays anzeigen lassen,
> die Konvertierung scheint so weit richtig zu sein, die ersten zig paar
> Werte und ein paar Stichproben haben jeweils richtige Werte ergeben

Wie gesagt, das macht er ordentlich. Aber da auch meine 
"32bit-Malfunktion" funktioniert, wundere ich mich, wo der Fehler 
herkommt. Das Rot vom Hemd und das Schwarz der Hose finden sich ja 
irgendwie auch wieder in den Kringeln.

Auch ändern des While(x <12) auf (x<11) oder 13 brachte bei  der 8bit 
Variante wie erwartet eine um 45 verzerrte version vom Männchen. Bei der 
32bit Variante ist es schwer  zu sagen, ob es das selbe Muster gleich 
verzerrt ist oder nicht.

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
J. T. schrieb:
> Wenn ich das 32bit-Array dann darstellen lasse:

Leider ist da der Fehlerteufel drin:
1
 BSP_LCD_DrawPixel(X, Y, (*(Bild_32b + (X*Y) + X )));
2
       X++;


Es hätte eher
1
BSP_LCD_DrawPixel(X, Y, (*(Bild_32b + (12*Y) + X )));
2
       X++;

heissen müssen.

Mit einem einfacheren Testmuster hätte man den Fehler deutlich leichter 
finden können.

von J. T. (chaoskind)


Bewertung
0 lesenswert
nicht lesenswert
Jim M. schrieb:
> BSP_LCD_DrawPixel(X, Y, (*(Bild_32b + (12*Y) + X )));
>        X++;

OOHHH MEIN GOTT!!! Ich danke dir. Wie ich diese Art von Fehler hasse. Da 
schlägt irgendwann die Betriebsblindheit gaaanz fies zu :D

Ich hatte grad einfach mal das ganze spasseshalber größer gemacht und 
wollt grad schreiben:

Irgendwie scheint da schon ne Art System drin zu stecken. Und dann steht 
da die Lösung. Es ist irgendwie ein ganz hübscher Effekt.

von J. T. (chaoskind)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal Bilder dazu.

von Olaf (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> OOHHH MEIN GOTT!!! Ich danke dir. Wie ich diese Art von Fehler hasse.

Dann solltest du vielleicht lernen den Debugger deiner 
Entwicklungsumgebung zu nutzen. Damit setzt du dann 2-3Breakpoints 
schaust die Daten an, hast eine Idee in welcher Ecke der Fehler liegt, 
gehst das Stueck mal im Singlestep durch und schaust dir dabei die 
Variablen genau an und schwups ist der Fehler gefunden.

Olaf

von J. T. (chaoskind)


Bewertung
0 lesenswert
nicht lesenswert
Olaf schrieb:
> Dann solltest du vielleicht lernen den Debugger deiner
> Entwicklungsumgebung zu nutzen. Damit setzt du dann 2-3Breakpoints
> schaust die Daten an, hast eine Idee in welcher Ecke der Fehler liegt,
> gehst das Stueck mal im Singlestep durch und schaust dir dabei die
> Variablen genau an und schwups ist der Fehler gefunden.

Würd ich dir normalerweise uneingeschränkt zustimmen. Aber hättest du 
den Thread ganz gelesen, hättest du gelesen, dass ich das getan habe.

Aber wenn du auf (X*y +y, *pointer) eingeschossen bist, weil es in der 
ursprünglichen Version (Xmax*y, Y, *pointer) hieß, hilft das leider auch 
nicht weiter, sondern sorgt nur für Verzweiflung :D

In meinem Kopf machte es nur "Ok ein Pixel wurde gemalt... mhh ja ist 
die richtige Position (halt das Pixel neben dem vorherigen). In der 
Tabelle angeguckt, was an dem Pointer steht.. Mh ja die Farbe kommt auch 
hin. HÄÄÄÄÄÄ???? WOOHER KOMMT DIESER FEHLER NUR??? X*Y+X ist doch auch 
richtig, hat ja immer geklappt"

Mir war halt klar, dass der Fehler an der Stelle liegen muss, aber die 
Betriebsblindheit gaukelte mir Richtigkeit vor.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.