Seite 1 von 1

Ein Bild Vertikal spiegeln.

Verfasst: 03.04.2022 16:32
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.

Re: Ein Bild Vertikal spiegeln.

Verfasst: 03.04.2022 20:22
von Andesdaf
Gib in der Forensuche 'Image spiegeln' ein und du wirst fündig werden.

Re: Ein Bild Vertikal spiegeln.

Verfasst: 03.04.2022 21:02
von funkheld
Das ist es nicht.
Die Farbwerte verändern sich.

Würde es gerne Byte für Byte wechseln mit Read und WriteByte.

Re: Ein Bild Vertikal spiegeln.

Verfasst: 03.04.2022 21:29
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.