Transparente Bereiche um ein Bild abschneiden

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Ara
Beiträge: 35
Registriert: 29.08.2004 13:40

Transparente Bereiche um ein Bild abschneiden

Beitrag 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
Win11 Pro
PureBasic 6.10 LTS
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: Transparente Bereiche um ein Bild abschneiden

Beitrag 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.
Guten Morgen, das ist ein schöner Tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Transparente Bereiche um ein Bild abschneiden

Beitrag 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
a²+b²=mc²
Benubi
Beiträge: 187
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: Transparente Bereiche um ein Bild abschneiden

Beitrag 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 

Antworten