Weiße Bildränder wegschneiden

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

edel hat geschrieben:
Dr. Shrek hat geschrieben:[...]
Wer schreibt den schnellsten Alghorithmus?
[...]
Einschränkungen:
1) Es darf nur die Point() Funktion zum Auslesen der Farbe verwendet werden.
2) Nur PB Code ohne Assembler [...]
Na mit den Einschraenkungen wird der schnellste Code aber immer noch
sehr sehr langsam sein.
Es geht 'nur' um den Algorithmus!
:wink:
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

das problem mit den JPGs ist in meinem fall nur ein problem des encoders, bzw des speicherns. auch bei qualität 10 wird ein unsauberes bild gespeichert. das hat aber nix mit dem algo zu tun isofern das quellbild sauber ist. wenn man ein sauberes jpg lädt und als bmp abspeichert, ist das ergebnis auch sauber - siehe hier:

Code: Alles auswählen

CreateImage(0, 100,100)
StartDrawing( ImageOutput(0) )
  Box(0,0,100,100,$00ff00)
  DrawingMode(#PB_2DDrawing_Outlined)
  Box(0,0,100,100,$0000ff)
StopDrawing()

UseJPEGImageEncoder()
UseJPEGImageDecoder()
SaveImage(0, GetTemporaryDirectory()+"j_p_g.jpg", #PB_ImagePlugin_JPEG, 10)
Delay(100)
LoadImage(1, GetTemporaryDirectory()+"j_p_g.jpg")
Delay(100)
DeleteFile(GetTemporaryDirectory()+"j_p_g.jpg")


SaveImage(0, GetTemporaryDirectory()+"b_m_p.bmp")
Delay(100)
LoadImage(2, GetTemporaryDirectory()+"b_m_p.bmp")
Delay(100)
DeleteFile(GetTemporaryDirectory()+"b_m_p.bmp")


ww=340
wh=120
hWin=OpenWindow(0, 50,50,ww,wh, "")
CreateGadgetList(hWin)
  ImageGadget(0, 10,10, 0,0, ImageID(0) )
  ImageGadget(1, 120,10, 0,0, ImageID(1) )
  ImageGadget(2, 230,10, 0,0, ImageID(2) )
  

Repeat
  event=WindowEvent()
  Select event
    Case #PB_Event_CloseWindow
      quit=1
  EndSelect
Until quit
ich hatte es nur so gemacht, das das zielformat immer dem quellformat entspricht, ist ja aber vielleicht nicht notwendig.






bei allen, die IrfanView verwenden, müßte dass hier laufen. ihr müßt nur den irfanView-pfad anpassen. das resultat wird erst als bmp gespeichert, und dann von irfanView konvertiert. iv hat zwar auch ein /jpgq paramter zum festlegen der jpg-qualität, aber ich hab gleich eine *.ini benutzt, damit auch andere einstellungen stimmten (z.b. subsampling=0 ..).

bei quell-JPG wird hier auch ein toleranz-wert benutzt. ich hab gemerkt, dass auch bei mit iv erstellten JPGs z.b. weiße flächen nicht exakt weiß bleiben (kann man am besten mit zauberstab-werkzeug in anderen programmen sehen)

Code: Alles auswählen

invalidColor=$ffffff
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageEncoder()

file.s=ProgramParameter()
If Not file
  file=OpenFileRequester("choooose", "E:\ProjectsPureBasic\killBorder\", "*.bmp;*.jpg;*.png|*.bmp;*.jpg;*.png", 0)
EndIf

If Not file
  End
EndIf

If Not LoadImage(0,file)
  MessageRequester("error", "can't load image!" )
  End
EndIf

w=ImageWidth(0)-1
h=ImageHeight(0)-1

If Not w*h
  MessageRequester("error", "invalid 	proportions."+#CRLF$+"width or height is 0!" )
  End
EndIf

start_i=-1 ; for is-blank-picture validation

If GetExtensionPart(file)="jpg"

  TOL= 16; tolerance width (0-255)

  StartDrawing( ImageOutput(0) )
    For i=0 To w
      For k=0 To h
        color=Point(i,k)
        If Not (   (color&$FF0000 >= (invalidColor&$FF0000)-TOL<<16) And (color&$FF0000 <= (invalidColor&$FF0000)+TOL<<16)   And   (color&$00FF00 >= (invalidColor&$00FF00)-TOL<<8) And (color&$00FF00 <= (invalidColor&$00FF00)+TOL<<8)   And   (color&$0000FF >= invalidColor&$0000FF-TOL) And (color&$0000FF <= invalidColor&$0000FF+TOL)   )
          start_i=i
          Break 2
        EndIf
      Next
    Next
    For k=0 To h
      For i=0 To w
        color=Point(i,k)
        If Not (   (color&$FF0000 >= (invalidColor&$FF0000)-TOL<<16) And (color&$FF0000 <= (invalidColor&$FF0000)+TOL<<16)   And   (color&$00FF00 >= (invalidColor&$00FF00)-TOL<<8) And (color&$00FF00 <= (invalidColor&$00FF00)+TOL<<8)   And   (color&$0000FF >= invalidColor&$0000FF-TOL) And (color&$0000FF <= invalidColor&$0000FF+TOL)   )
          start_k=k
          Break 2
        EndIf
      Next
    Next
    For i=w To 0 Step -1
      For k=h To 0 Step -1
        color=Point(i,k)
        If Not (   (color&$FF0000 >= (invalidColor&$FF0000)-TOL<<16) And (color&$FF0000 <= (invalidColor&$FF0000)+TOL<<16)   And   (color&$00FF00 >= (invalidColor&$00FF00)-TOL<<8) And (color&$00FF00 <= (invalidColor&$00FF00)+TOL<<8)   And   (color&$0000FF >= invalidColor&$0000FF-TOL) And (color&$0000FF <= invalidColor&$0000FF+TOL)   )
          stop_i=i
          Break 2
        EndIf
      Next
    Next
    For k=h To 0 Step -1
      For i=w To 0 Step -1
        color=Point(i,k)
        If Not (   (color&$FF0000 >= (invalidColor&$FF0000)-TOL<<16) And (color&$FF0000 <= (invalidColor&$FF0000)+TOL<<16)   And   (color&$00FF00 >= (invalidColor&$00FF00)-TOL<<8) And (color&$00FF00 <= (invalidColor&$00FF00)+TOL<<8)   And   (color&$0000FF >= invalidColor&$0000FF-TOL) And (color&$0000FF <= invalidColor&$0000FF+TOL)   )
          stop_k=k
          Break 2
        EndIf
      Next
    Next
  StopDrawing()
Else
  StartDrawing( ImageOutput(0) )
    For i=0 To w
      For k=0 To h
        If Not Point(i,k)=invalidColor
          start_i=i
          Break 2
        EndIf
      Next
    Next
    For k=0 To h
      For i=0 To w
        If Not Point(i,k)=invalidColor
          start_k=k
          Break 2
        EndIf
      Next
    Next
    For i=w To 0 Step -1
      For k=h To 0 Step -1
        If Not Point(i,k)=invalidColor
          stop_i=i
          Break 2
        EndIf
      Next
    Next
    For k=h To 0 Step -1
      For i=w To 0 Step -1
        If Not Point(i,k)=invalidColor
          stop_k=k
          Break 2
        EndIf
      Next
    Next
  StopDrawing()
EndIf


cw=stop_i-start_i+1
ch=stop_k-start_k+1

If start_i=-1
  MessageRequester("error", "kidding?!? that's a blank picture!" )
  End  
EndIf

If Not ( cw>0 And ch>0 And CreateImage(1, cw,ch) )
  MessageRequester("error", "can't create image!" )
  End
EndIf


StartDrawing( ImageOutput(1) )
  DrawImage(ImageID(0), -start_i, -start_k )
StopDrawing()


Select LCase( GetExtensionPart(file) )
  Case "bmp"
    SaveImage(1, GetPathPart(file)+"~"+GetFilePart(file), #PB_ImagePlugin_BMP )
  Case "png"
    SaveImage(1, GetPathPart(file)+"~"+GetFilePart(file), #PB_ImagePlugin_PNG )
  Case "jpg"
    ;SaveImage(1, GetPathPart(file)+"~"+GetFilePart(file), #PB_ImagePlugin_JPEG, 10)
    
    file_bmp.s=GetTemporaryDirectory()+"iv_convert_temp.bmp"
    SaveImage(1, file_bmp, #PB_ImagePlugin_BMP )
    file_ini.s=GetTemporaryDirectory()+"i_view32.ini"
    iv_dir.s="C:\Programme\IrfanView\"
    If ReadFile(0, iv_dir+"i_view32.ini")
      If CreateFile(1, file_ini)
        While Not Eof(0)
          s.s=ReadString(0)
          If FindString(s, "Save Quality", 1)
            s="Save Quality=100"
          ElseIf FindString(s, "Save Grayscale", 1)
            s="Save Grayscale=0"
          ElseIf FindString(s, "NoSampling", 1)
            s="NoSampling=1"
          EndIf
          WriteStringN(1, s)
        Wend
        CloseFile(1)
      EndIf
      CloseFile(0)
    EndIf
    Delay(100)
    param.s= file_bmp+" /ini="+GetTemporaryDirectory()+" /convert="+GetPathPart(file)+"~"+GetFilePart(file)
    RunProgram("C:\Programme\IrfanView\i_view32.exe", param, "", #PB_Program_Wait)
    Delay(100)
    DeleteFile(file_bmp)
    DeleteFile(file_ini)
EndSelect

my pb stuff..
Bild..jedenfalls war das mal so.
blondy
Beiträge: 2
Registriert: 16.12.2015 18:10

Re: Weiße Bildränder wegschneiden

Beitrag von blondy »

Hallo,

ich hole diesen Uralt-Beitrag mal hoch, da ich per Google auf genau das Thema gestoßen bin. Ich bin selbst kein Programmieren und hatte vorher noch einmal was von PureBasic gehört. Wie führe ich denn den Code aus? Brauch ich dafpr eine Umgebung wie bei Python? Wo müssen die zu beschneidenden Dateien liegen, wenn ich den Code ausführe?
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Weiße Bildränder wegschneiden

Beitrag von Kiffi »

blondy hat geschrieben:Ich bin selbst kein Programmieren und hatte vorher noch einmal was von PureBasic gehört.
in diesem Fall würde ich Dir empfehlen, die Ränder mit IrfanView (http://www.irfanview.com/) wegzuschneiden.

Diesen Vorgang kann man auch als Batch auf mehrere Bilder ausführen lassen.

Bild

Grüße ... Peter
Hygge
blondy
Beiträge: 2
Registriert: 16.12.2015 18:10

Re: Weiße Bildränder wegschneiden

Beitrag von blondy »

Ich weiß schon, dass diverse Grafiktools solche Funktionen bieten, ich hab nur das Problem, dass ich Scans und keine sauberen Bilder habe. Das heißt die Ränder sehen weiß aus, für das Programm sind aber nicht alle Pixel gleich, die RGB-Werte sind vermutlich bei jedem anders. Kann ich in IrfanView eine Art Toleranz einstellen wie stark die zu entfernenden Pixel vom perfekten Weiß abweichend können? Bei mir ist der Output gleich dem Input, es nichts nichts weggeschnitten (oder es ist so wenig, dass es nicht auffällt).
Antworten