Ein Bild Vertikal spiegeln.

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Ein Bild Vertikal spiegeln.

Beitrag von funkheld »

Hallo, guten Tag.
Wie kann man bitte ein Bild Vertikal spiegeln mit einfachen aufruf der Daten und wieder reinschreiben der Daten in eine neue Datei?

Hat 49152 Byte (256x192)
Breite 256 Byte und eine Höhe von 192 Byte.

Möchte es mit Purebasic machen und nicht mit einem Aufruf von einem Grafikprogramm (Irfan oder so...)

Danke.
Andesdaf
Moderator
Beiträge: 2660
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Ein Bild Vertikal spiegeln.

Beitrag von Andesdaf »

Gib in der Forensuche 'Image spiegeln' ein und du wirst fündig werden.
Win11 x64 | PB 6.00 (x64)
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Re: Ein Bild Vertikal spiegeln.

Beitrag von funkheld »

Das ist es nicht.
Die Farbwerte verändern sich.

Würde es gerne Byte für Byte wechseln mit Read und WriteByte.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Ein Bild Vertikal spiegeln.

Beitrag von RSBasic »

Für ein Spiel habe ich folgenden Code verwendet, um Grafiken zu spiegeln: viewtopic.php?p=348908#p348908
Davon eine angepasste Version für Sprites, die sich in meiner GameFunctions.pbi-Datei (enthält viele wiederverwendbare Funktionen) befindet:

Code: Alles auswählen

Procedure MirrorSprite(SpriteID)
  Protected zeilenlaenge
  Protected hoehe
  Protected breite
  Protected tiefe
  Protected *linkes.pixel
  Protected *rechtes.pixel
  Protected i, j, k, l
  Protected halbe_breite
  Protected farbpuffer
  Protected *pixelpuffer
  
  If StartDrawing(SpriteOutput(SpriteID))
    *linkes.pixel = DrawingBuffer()
    zeilenlaenge = DrawingBufferPitch()
    StopDrawing()
  EndIf
  
  hoehe = SpriteHeight(SpriteID)
  breite = SpriteWidth(SpriteID)
  tiefe = SpriteDepth(SpriteID) / 8
  halbe_breite = breite / 2
  l = ((breite - 1) * tiefe)
  
  For i = 1 To hoehe
    k = zeilenlaenge
    *rechtes = *linkes + (tiefe * (breite-1))
    For j = 1 To halbe_breite
      farbpuffer = *linkes\pix_l
      *linkes\pix_l = *rechtes\pix_l
      *rechtes\pix_l = farbpuffer
      
      *linkes + tiefe
      *rechtes - tiefe
      k - tiefe
    Next
    *linkes + k
  Next
  ProcedureReturn -1
  
EndProcedure
Mit diesem Code konnte ich keine Veränderung der Farbwerte feststellen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten