Hallo Freunde, könnt ihr mir sagen, wieso ich folgendes verzerrtes Bild (siehe Anhang) unter dem Bitmap erhalte bzw. hatte jemand schonmal so ein Problem Der Code für das Zeichnen eines Bitmaps sieht wie folgt aus: void UTFT::drawBitmap(int x, int y, int sx, int sy, bitmapdatatype data, int scale) { unsigned int col; int tx, ty, tc, tsx, tsy; byte r, g, b; if (scale==1) { setXY(x, y, x+sx-1, y+sy-1); for (tc=0; tc<(sx*sy); tc++) { col=pgm_read_word(&data[tc]); LCD_Write_DATA(col>>8,col & 0xff); } } else { for (ty=0; ty<sy; ty++) { setXY(x, y+(ty*scale), x+((sx*scale)-1), y+(ty*scale)+scale); for (tsy=0; tsy<scale; tsy++) for (tx=0; tx<sx; tx++) { col=pgm_read_word(&data[(ty*sx)+tx]); for (tsx=0; tsx<scale; tsx++) LCD_Write_DATA(col>>8,col & 0xff); } } } clrXY(); }
Wenn du Bilder auf dein Display zaubern willst kommt es auf die Dataorder an. Also deine Bilddaten pro Pixel werden als WORD im Speicher abgelegt. Und du liest auch wieder ein WORD aus. Soweit so gut. Aber wenn du die Bilder vom PC überträgst (Speicherkarte oder so) dann kann es sein, dass am PC zuerst das Low-Byte und dann das High-Byte gespeichert werden. Dein Display braucht die Daten aber genau umgekehrt. Also versuche mal die Dataorder zu tauschen. Vielleicht funktioniert das schon. Wenn nicht muss du den gesamten Code posten. So kann keiner sehen was die LCD_WRITE-Funktion wirklich macht. Gruß, Jens
Ist die Schrift auch Teil des Bildes? Oder ist das anders erzeugt. Wenn das zum Bild gehört, dann gilt das nicht mehr was ich oben geschrieben habe. Dann sieht es so aus als ob dein Lesepointer den Bereich verlässt wo auch wirklich Bilddaten im Speicher stehen. Das sind dann nur zufallswerte. Gruß; jens
Jens schrieb: > Also versuche mal die Dataorder zu tauschen. Vielleicht funktioniert das > schon. >Dann sieht es so aus als ob dein Lesepointer den Bereich verlässt wo auch wirklich Bilddaten im Speicher stehen. Das sind dann nur zufallswerte also ich habe das array per lcd assistant aus einem bild erzeugt. data order habe ich versucht. das Hat leider nichts gebracht. void UTFT::LCD_Write_DATA(uint8_t data) //ilitek s.31 { DC_TFT_HIGH; CS_TFT_LOW; SPI.SPI_transfer(data); CS_TFT_HIGH; } void UTFT::LCD_Write_DATA(uint8_t VH,uint8_t VL) //16 Bit dateien { LCD_Write_DATA(VH); //LowByte LCD_Write_DATA(VL); //HighByte }
Hallo, Wie du das Bild erzeugt hast sagt aber noch nichts darüber aus WO es im Speicher steht. Dazu brauchst du die Startadresse und die Länge deines Bildes. Vor allem ist in deiner Funktion noch ein Zoom mit eingebaut. Kommentiere das zuerst mal aus, dass man nur nach einem Fehler sucht. Wenn die Bilder in normaler Größe angezeigt werden, kannst du dich um den Zoom kümmern. Also den Wert scale weg und nur den ersten Teil in deiner if-Anweisung stehen lassen. Wo kommt denn das Bild her? Da steht zwar eine Referenz auf ein Datenfeld, aber nichts wie die Daten von deinem Bild da hinein kommen! Wie stellst du sicher, dass in dem Feld die RICHTIGEN Daten stehen? Nochmal: Bitte poste den gesamten Code sonst kann man nur Vermutungen anstellen. Grüße, Jens
Jens schrieb: > Nochmal: > Bitte poste den gesamten Code sonst kann man nur Vermutungen anstellen. also jens erstmal vielen dank dir für deine hilfe. du scheinst dich da wirklich auszukennen und ich hoffe, dass ich es mithilfe deiner unterstützung hinbekomme. habe mein code als anhang beigefügt. kleine notiz, die mich gerade stark verwundert: ich habe mittlerweile 2 bilder implementier. wenn ich in meiner main allerdings nur ein bild aufrufe, zeigt er mir mittlerweile beide auf dem bildschirm an obwohl ein neues init und ein neues clrScr stattfindet. wie kann das sein
Mit dem LCD assistant wird mir aus dem bild ein array generiert. dies auf richtigkeit zu überprüfen fällt natürlich schwer...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.