Seite 1 von 1

Transparente Bereiche um ein Bild abschneiden

Verfasst: 24.09.2023 10:46
von Ara
Hi,
ich suche einen Befehl oder eine Möglichkeit den Transparenten Bereich, der von einem Bild umgeben ist abzuschneiden.
Es handelt sich um mehrere Bilder mit verschiedenen Auflösungen, z.B. 200x100 Pixel, in denen eine Grafik mit verschiedenen Auflösungen, z.B. 190x70 Pixel dargestellt wird.
Ich möchte den Bereich um den sichtbaren Teil entfernen um hier ein Bild mit 190x70 Pixel zu erhalten.
Welche Möglichkeiten bietet Purebasic?
Über kleine Beispiele würde ich mich freuen.

Danke und viele Grüße
Thomas

Re: Transparente Bereiche um ein Bild abschneiden

Verfasst: 27.09.2023 10:31
von jacdelad
Hi Ara,
Ich hab das selbst noch nicht gemacht, aber ich würde links einmal von oben nach unten testen, ob alle Pixel transparent sind. Falls ja dann die zweite Reihe und so weiter bis das erste nicht transparente Pixel kommt. Dann von rechts, von oben und unten das gleiche. Anschließend entsprechend zuschneiden.
PureBasic bietet von Haus aus nichts in der Richtung, das musst du selbst programmieren. Ist aber nicht schwer, eher eine Fleißaufgabe.

Re: Transparente Bereiche um ein Bild abschneiden

Verfasst: 27.09.2023 10:36
von Kiffi
@Ara:

ich hatte vor Jahren mal eine ähnliche Frage. Vielleicht ist unter den Antworten etwas Nützliches für Dich dabei: Weiße Bildränder wegschneiden

Re: Transparente Bereiche um ein Bild abschneiden

Verfasst: 06.10.2023 18:41
von Benubi
Hab mal auf Anhieb sowas jetzt gebastelt, funktioniert aber nur mit einer durchsichtigen Farbe, ohne Alpha Kanal.

Code: Alles auswählen

; CropImage.pb
; ------------
; (c) 2023 by benubi
;;
;
; Remove image edges.
;
; Bildränder entfernen.
;
; Supprimer les bords de l'image.
;
;

Procedure CropImage( Image, NewImage, TransparentColor=-1)
  Protected xmin, ymin, xmax, ymax
  Protected x, y
  Protected width, height
  Protected t_result 
  If IsImage(Image)  = #Null : ProcedureReturn #Null : EndIf 
  width  = ImageWidth(Image)
  height = ImageHeight(Image)
  xmin = width 
  ymin = height
  If StartDrawing(ImageOutput(Image))
    If TransparentColor = -1
      TransparentColor=Point(0,0)
    EndIf 
    For y = 0 To height - 1
      For x = 0 To width - 1
        If TransparentColor<>Point(x,y)
          If x>xmax
            xmax=x
          EndIf 
          If x<xmin
            xmin=x
          EndIf 
          If y>ymax
            ymax=y
          EndIf 
          If y<ymin
            ymin=y
          EndIf 
        EndIf 
      Next
    Next
    StopDrawing()
    t_result = GrabImage(Image, NewImage, xmin, ymin, 1 + (xmax-xmin), 1 + (ymax-ymin))
  EndIf
  ProcedureReturn t_result
EndProcedure



CompilerIf #PB_Compiler_IsMainFile

UsePNGImageDecoder()
UseGIFImageDecoder()
UseTGAImageDecoder()
UseJPEG2000ImageDecoder()
UseJPEGImageDecoder()
UseTIFFImageDecoder()

Define File$ = OpenFileRequester("Load file to crop","file_to_crop.pb","Image files|*.gif;*.png;*.bmp;*.tga;*.tiff;*.ico;*.jpg;*.jpeg|All files|*.*",0)

LoadImage(1, File$)

CropImage(1, 2)

OpenWindow(1,0,0,ImageWidth(1),ImageHeight(1),"Original image "+Str(ImageWidth(1))+"x"+Str(ImageHeight(1)),#PB_Window_SystemMenu)
ImageGadget(1,0,0,WindowWidth(1),WindowHeight(1), ImageID(1))

OpenWindow(2,0,0,ImageWidth(2),ImageHeight(2),"Cropped image "+Str(ImageWidth(2))+"x"+Str(ImageHeight(2)),#PB_Window_SystemMenu)
ImageGadget(2,0,0,WindowWidth(2),WindowHeight(2), ImageID(2))

Repeat 
  
Until WaitWindowEvent()=#PB_Event_CloseWindow

Debug "Good bye."

End

CompilerEndIf