Es geht 'nur' um den Algorithmus!edel hat geschrieben:Na mit den Einschraenkungen wird der schnellste Code aber immer nochDr. 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 [...]
sehr sehr langsam sein.
Weiße Bildränder wegschneiden
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
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:
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
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
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
Re: Weiße Bildränder wegschneiden
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?
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?
Re: Weiße Bildränder wegschneiden
in diesem Fall würde ich Dir empfehlen, die Ränder mit IrfanView (http://www.irfanview.com/) wegzuschneiden.blondy hat geschrieben:Ich bin selbst kein Programmieren und hatte vorher noch einmal was von PureBasic gehört.
Diesen Vorgang kann man auch als Batch auf mehrere Bilder ausführen lassen.
Grüße ... Peter
Hygge
Re: Weiße Bildränder wegschneiden
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).