Farbmixer *SucheBuggrund*
Verfasst: 28.07.2005 20:53
Hier ein kleines Programm, mit dem man das Bild verwischen und ein Mosaik aus einem Bild erstellen kann. Zusätzlich kann man das Bild zufällig überarbeiten und daraus einen ASCII Text generieren.
Code: Alles auswählen
Global sprite.b
sprite=1
If InitSprite()
sprite=1
Else
sprite=0
EndIf
Enumeration
#wisch
EndEnumeration
;- Gadget Constants
Global FontName.s
Global FontSize.b
FontName="Arial"
FontSize=6
FontStyle=#PB_Font_Bold
LoadFont(1,FontName,FontSize,FontStyle)
Enumeration
#start
#Image_1
#Image_2
#ProgressBar
#rec
#Text_1
#Text_2
#check
#save
#load
#state
#enableprogress
#verwisch
#mosaik
#groesse
#kant
#abort
#random
#ascii
#Text
#font
#benpiccosoft
#undo
#print
EndEnumeration
Procedure scroll(window)
Protected text$
Protected merk$
Repeat
text$=GetWindowTitle(window)
merk$=Left(text$,1)
text$=Right(text$,Len(text$)-1)+merk$
Delay(100)
If SetWindowTitle(window,text$):EndIf
ForEver
EndProcedure
Procedure sucsecc()
For x=1 To 3
beep_(100*x,100)
Next
beep_(1000,150)
beep_(750,50)
beep_(1250,75)
EndProcedure
Procedure shake(window)
CreateThread(@sucsecc(),0)
For x=1 To 5
MoveWindow(WindowX()+Random(4),WindowY()+Random(4))
Delay(100)
MoveWindow(WindowX()-Random(4),WindowY()-Random(4))
Delay(100)
Next
EndProcedure
Procedure.s html_hex(color.l)
red$= LSet(Hex(Red(color)),2,"0")
green$= LSet(Hex(Green(color)),2,"0")
blue$= LSet(Hex(Blue(color)),2,"0")
ProcedureReturn "#"+red$+green$+blue$
EndProcedure
Dim Bild.l(1,1)
Procedure ReloadImage(Image)
FlipBuffers()
UseImage(Image)
Dim Bild.l(ImageWidth(),ImageHeight())
If sprite=1
SaveImage(Image,GetTempPath()+"\temp.bmp")
LoadSprite(1,GetTempPath()+"\temp.bmp")
StartDrawing(SpriteOutput(1))
*buffer=DrawingBuffer()
Height=SpriteHeight(1)
Width=SpriteWidth(1)
pitch= DrawingBufferPitch()
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
pixelformat= DrawingBufferPixelFormat()
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;Debug "sprite"
For y=1 To Height
WindowEvent()
For x=1 To Width
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Select pixelformat
Case #PB_PixelFormat_32Bits_BGR
bgr=PeekL(*buffer+4*z+z2)
rgb=(((bgr & $FF) << 16)|(((bgr >>8 ) & $FF)<<8)|((bgr >>16) & $FF))
Bild(x-1,y-1)=rgb
Case #PB_PixelFormat_32Bits_RGB
Bild(x-1,y-1)=PeekL(*buffer+4*z+z2)
EndSelect
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
z+1
Next
z = 0
z2 + pitch
Next
StopDrawing()
Else
StartDrawing(ImageOutput())
For y=1 To ImageHeight()
For x=1 To ImageWidth()
WindowEvent()
Bild(x,y)=Point(x,y)
Next
Next
StopDrawing()
EndIf
EndProcedure
Procedure wisch(SourceIMG,TargetIMG,mode)
Protected count.l
UseImage(SourceIMG)
CreateImage(TargetIMG,ImageWidth(),ImageHeight())
Dim farbe.l(ImageWidth(),ImageHeight())
UseImage(TargetIMG)
If GetGadgetState(#enableprogress)=1
enableprogress=1
EndIf
StartDrawing(ImageOutput())
For y=0 To ImageHeight()
For x=0 To ImageWidth()
If x-1>0 And x+1<ImageWidth() And y-1>0 And y+1 < ImageHeight()
red.f=(Red(Bild(x,y))+Red(Bild(x+1,y))+Red(Bild(x,y+1))+Red(Bild(x+1,y+1))+Red(Bild(x-1,y))+Red(Bild(x,y-1))+Red(Bild(x-1,y-1))+Red(Bild(x+1,y-1))+Red(Bild(x-1,y+1)))/9
green.f=(Green(Bild(x,y))+Green(Bild(x+1,y))+Green(Bild(x,y+1))+Green(Bild(x+1,y+1))+Green(Bild(x-1,y))+Green(Bild(x,y-1))+Green(Bild(x-1,y-1))+Green(Bild(x+1,y-1))+Green(Bild(x-1,y+1)))/9
blue.f=(Blue(Bild(x,y))+Blue(Bild(x+1,y))+Blue(Bild(x,y+1))+Blue(Bild(x+1,y+1))+Blue(Bild(x-1,y))+Blue(Bild(x,y-1))+Blue(Bild(x-1,y-1))+Blue(Bild(x+1,y-1))+Blue(Bild(x-1,y+1)))/9
If mode=1
If red>255
red=red-255
EndIf
If green>255
green=green-255
EndIf
If blue>255
blue=blue-255
EndIf
EndIf
Plot(x,y,RGB(red,green,blue))
If enableprogress=1
count+1
progress.f=(count/(ImageHeight()*ImageWidth()))*100
SetGadgetState(#ProgressBar,progress)
EndIf
EndIf
Next
Next
StopDrawing()
If enableprogress=1
SetGadgetState(#ProgressBar,100)
EndIf
EndProcedure
Procedure mosaik(SourceIMG,TargetIMG,groesse,zw,mode)
If GetGadgetState(#enableprogress)=1
enableprogress=1
EndIf
Protected count.l
count=0
UseImage(SourceIMG)
CreateImage(TargetIMG,ImageWidth(),ImageHeight())
UseImage(TargetIMG)
StartDrawing(ImageOutput())
For y=0 To ImageHeight() ;Step groesse
For x=0 To ImageWidth() ;Step groesse
If enableprogress=1
count+1
progress.f=(count/((ImageHeight()/10)*(ImageWidth()/10)))*100
SetGadgetState(#ProgressBar,progress)
EndIf
red.f=0
green.f=0
blue.f=0
For z=0 To groesse
For q=0 To groesse
If x+q<ImageWidth() And y+z<ImageHeight()
red.f=red+Red(Bild(x+q,y+z))
green.f=green+Green(Bild(x+q,y+z))
blue.f=blue+Blue(Bild(x+q,y+z))
EndIf
Next
Next
red=red/Pow(groesse+1,2)
green=green/Pow(groesse+1,2)
blue=blue/Pow(groesse+1,2)
Box(x,y,groesse+zw,groesse+zw,RGB(red,green,blue))
If mode=1
farbe.l=RGB(red/1.5,green/1.5,blue/1.5)
Plot(x,y,farbe)
For z=1 To groesse
Plot(x+z,y,farbe)
Plot(x+z,y+groesse,RGB(Red(farbe)/z,Green(farbe)/z,Blue(farbe)/z))
Next
For z=1 To groesse
Plot(x,y+z,farbe)
Plot(x+groesse,y+z,RGB(Red(farbe)/z,Green(farbe)/z,Blue(farbe)/z))
Next
EndIf
x+groesse
Next
y+groesse
Next
StopDrawing()
EndProcedure
Procedure ran(SourceIMG,TargetIMG)
If GetGadgetState(#enableprogress)=1
enableprogress=1
EndIf
Protected count.l
count=0
UseImage(SourceIMG)
CreateImage(TargetIMG,ImageWidth(),ImageHeight())
UseImage(TargetIMG)
StartDrawing(ImageOutput())
For y=0 To ImageHeight()
For x=0 To ImageWidth()
If enableprogress=1
count+1
progress.f=(count/((ImageHeight())*(ImageWidth())))*100
SetGadgetState(#ProgressBar,progress)
EndIf
Plot(x,y,RGB(Random(Red(Bild(x,y))),Random(Green(Bild(x,y))),Random(Blue(Bild(x,y)))))
Next
Next
StopDrawing()
EndProcedure
Procedure ASCII_text(SourceIMG,TargetIMG,mode)
If GetGadgetState(#enableprogress)=1
enableprogress=1
EndIf
Protected count.l
count=0
UseImage(SourceIMG)
CreateImage(TargetIMG,ImageWidth(),ImageHeight())
UseImage(TargetIMG)
StartDrawing(ImageOutput())
DrawingMode(1)
DrawingFont(UseFont(1))
For y=0 To ImageHeight()
For x=0 To ImageWidth()
If enableprogress=1
count+1
progress.f=(count/((ImageHeight())*(ImageWidth())))*100
SetGadgetState(#ProgressBar,progress)
EndIf
red.f=0
green.f=0
blue.f=0
For z=0 To FontSize-1
For q=0 To FontSize-1
If x+q<ImageWidth() And y+z<ImageHeight()
red.f=red+Red(Bild(x+q,y+z))
green.f=green+Green(Bild(x+q,y+z))
blue.f=blue+Blue(Bild(x+q,y+z))
EndIf
Next
Next
red=red/Pow(FontSize,2)
green=green/Pow(FontSize,2)
blue=blue/Pow(FontSize,2)
FrontColor(red,green,blue)
Locate(x,y)
If mode=0
new$=Chr((red+green+blue)/3)
DrawText(new$)
x+TextLength(new$)
ElseIf mode=1
new$=Chr(Random(25) + 65)
DrawText(new$)
x+TextLength(new$)
EndIf
Next
y+FontSize
Next
StopDrawing()
EndProcedure
Procedure Open_wisch()
If OpenWindow(#wisch, 284, 160, 580, 310, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered , " Farbmixer 1.4c ")
If CreateGadgetList(WindowID())
ButtonGadget(#start, 220, 280, 90, 25, "Start")
ImageGadget(#Image_1, 50, 40, 190, 140, LoadImage(0, ""), #PB_Image_Border)
ImageGadget(#Image_2, 250, 40, 190, 140, LoadImage(0, ""), #PB_Image_Border)
ProgressBarGadget(#ProgressBar, 160, 220, 210, 20, 0, 100, #PB_ProgressBar_Smooth)
TrackBarGadget(#rec, 90, 250, 300, 20, 1, 100, #PB_TrackBar_Ticks)
TextGadget(#Text_1, 10, 250, 80, 20, "Durchläufe: 1")
CheckBoxGadget(#check,10,210,130,15,"Keine Gitternetzlinien")
TextGadget(#state,150,200,200,15," ")
ButtonGadget(#load,400,250,100,20,"Laden")
ButtonGadget(#save,400,270,100,20,"Speichern")
CheckBoxGadget(#enableprogress,10,225,150,15,"Enable Progressbar")
OptionGadget(#verwisch,400,200,120,15,"Unschärfe generieren")
OptionGadget(#mosaik,400,215,100,15,"Mosaik erstellen")
OptionGadget(#random,400,230,100,15,"Zufallsmuster")
OptionGadget(#ascii,400,185,100,15,"ASCII-Text")
SpinGadget(#groesse,80,270,30,15,1,300)
TextGadget(#Text_2,10,270,70,15,"Mosaikgröße")
CheckBoxGadget(#kant,10,195,100,15,"Steinkanten")
CheckBoxGadget(#Text,10,180,100,15,"Zufälliger Text")
ButtonGadget(#abort,320,283,80,20,"Abbrechen")
ButtonGadget(#font,110,180,100,17,"Schriftart wählen")
TextGadget(#benpiccosoft,600,300,300,15,Chr(169)+" 2005 BenpiccoSoft")
ButtonGadget(#undo,220,180,100,17,"Rückgängig")
ButtonGadget(#print,400,290,100,17,"Drucken")
EndIf
OpenWindowedScreen(WindowID(#wisch),1000,1000,1,1,0,0,0)
EndIf
SetGadgetState(#verwisch,1)
DisableGadget(#kant,1)
DisableGadget(#check,1)
SetGadgetState(#groesse,10)
SetGadgetText(#groesse,Str(GetGadgetState(#groesse)))
DisableGadget(#groesse,1)
DisableGadget(#abort,1)
DisableGadget(#Text,1)
DisableGadget(#font,1)
DisableGadget(#undo,1)
DisableGadget(#print,1)
EndProcedure
Open_wisch()
#gadgets=23
Dim abstX.w(#gadgets)
Dim abstY.w(#gadgets)
Dim GadgetOldWidth.w(#gadgets)
Dim GadgetOldHeight.w(#gadgets)
Dim typ.b(#gadgets)
UseWindow(#wisch)
For x=0 To #gadgets
abstX(x)=WindowWidth()-GadgetX(x)
abstY(x)=WindowHeight()-GadgetY(x)
GadgetOldWidth(x)=GadgetWidth(x)
GadgetOldHeight(x)=GadgetHeight(x)
typ(x)=4
Next
typ(#Image_1)=2
typ(#Image_2)=3
DisableGadget(#start,1)
DisableGadget(#save,1)
CreateThread(@scroll(),#wisch)
image$=ProgramParameter()
If image$
If GetExtensionPart(image$)="bmp" Or GetExtensionPart(image$)="jpg" Or GetExtensionPart(image$)="png" Or GetExtensionPart(image$)="tiff" Or GetExtensionPart(image$)="tga"
Goto load
Else
If MessageRequester("info","Achtung, das von ihnen gewählte Bildvormat wird nicht unterstützt! Es kann daher zu Fehlern kommen. Trotzdem laden?",#PB_Requester_MultiSelection)=1
Goto load
EndIf
EndIf
EndIf
Repeat
Delay(1)
If WindowHeight.f<>WindowHeight() Or WindowWidth.f<>WindowWidth()
For x=0 To #gadgets
If typ(x)=1
ResizeGadget(x,WindowWidth()-abstX(x),WindowHeight()-abstY(x),GadgetWidth(x),GadgetHeight(x))
ElseIf typ(x)=2
ResizeGadget(x,GadgetX(x),GadgetY(x),WindowWidth()-abstX(x)-GadgetX(x)+GadgetOldWidth(x),WindowHeight()-abstY(x)-GadgetY(x)+GadgetOldHeight(x))
ElseIf typ(x)=3
ResizeGadget(x,WindowWidth()-abstX(x),GadgetY(x),WindowWidth()-abstX(x)-GadgetWidth(x)+GadgetOldWidth(x),WindowHeight()-abstY(x)-GadgetY(x)+GadgetOldHeight(x))
ElseIf typ(x)=4
ResizeGadget(x,GadgetX(x),WindowHeight()-abstY(x),GadgetWidth(x),GadgetHeight(x))
ElseIf typ(x)=5
ResizeGadget(x,WindowWidth()-abstX(x),GadgetY(x),GadgetWidth(x),GadgetHeight(x))
EndIf
Next
If IsImage(2)
;Debug "Image existiert"
CopyImage(2,0)
ResizeImage(0,GadgetWidth(#Image_2),GadgetHeight(#Image_2))
SetGadgetState(#Image_2,UseImage(0))
LoadImage(10,image$)
ResizeImage(10,GadgetWidth(#Image_1),GadgetHeight(#Image_1))
SetGadgetState(#Image_1,UseImage(10))
EndIf
ResizeGadget(#Image_2,GadgetX(#Image_2),GadgetY(#Image_2),GadgetWidth(#Image_1),GadgetHeight(#Image_1))
EndIf
WindowWidth=WindowWidth()
WindowHeight=WindowHeight()
Event = WaitWindowEvent()
If Event = #PB_EventGadget
;Debug "WindowID: " + Str(EventWindowID())
GadgetID = EventGadgetID()
If GadgetID = #start
DisableGadget(#abort,0)
CopyImage(1,3)
DisableGadget(#undo,0)
For a=1 To GetGadgetState(#rec)
SetGadgetText(#state,"Durchlauf "+Str(a)+" von "+Str(GetGadgetState(#rec)))
If GetGadgetState(#mosaik)=1
mosaik(1,2,GetGadgetState(#groesse),GetGadgetState(#check),GetGadgetState(#kant))
ElseIf GetGadgetState(#verwisch)=1
wisch(1,2,0)
ElseIf GetGadgetState(#random)=1
ran(1,2)
ElseIf GetGadgetState(#ascii)=1
ASCII_text(1,2,GetGadgetState(#Text))
EndIf
CopyImage(2,1)
CopyImage(2,0)
ResizeImage(0,GadgetWidth(#Image_1),GadgetHeight(#Image_1))
UseImage(0)
SetGadgetState(#Image_2,ImageID())
If WindowEvent() = #PB_EventGadget
If EventGadgetID() =#abort
SetGadgetText(#state,"Abgebrochen nach "+Str(a)+" Durchläufen")
Break
EndIf
EndIf
;If GetGadgetState(#rec)>1
SetGadgetText(#state,"Erneuere Bild")
ReloadImage(1)
;EndIf
Next
DisableGadget(#save,0)
If GetGadgetText(#state)<>"Abgebrochen nach "+Str(a)+" Durchläufen"
SetGadgetText(#state,"Fertig!")
shake(#wisch)
EndIf
DisableGadget(#abort,1)
ElseIf GadgetID =#load
image$=OpenFileRequester("Bild auswählen","c:\","Grafik Files|*.bmp;*.jpg;*.png;*.tiff;*.tga|Bitmaps|*.bmp|JPEGs|*.jpg|TrueVision Targa|*.tga|Tiff|*.tiff",-1)
If image$
load:
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
UseJPEGImageDecoder()
SetGadgetText(#state,"Loading...")
DisableGadget(#start,0)
If LoadImage(1,image$)
CopyImage(1,0)
CopyImage(1,2)
ResizeImage(0,GadgetWidth(#Image_1),GadgetHeight(#Image_1))
UseImage(0)
SetGadgetState(#Image_1,ImageID())
ReloadImage(1)
SetGadgetText(#state,"Bereit")
DisableGadget(#save,0)
DisableGadget(#print,0)
Else
MessageRequester("error","Bild konnte nicht geladen werden")
SetGadgetText(#state,"Fehler beim laden von "+GetFilePart(image$))
EndIf
EndIf
EndIf
ElseIf GadgetID=#save
save$=SaveFileRequester("Speicherort auswählen","Mixbild","Bitmap|*.bmp |Jpeg|*.jpg|PortableNetworkGrafics|*.png|HTML-Seite|*.html;*.htm",0)
Select SelectedFilePattern()
Case 0
extend.s="bmp"
Case 1
extend="jpg"
Case 2
extend="png"
Case 3
extend="html"
EndSelect
If save$
SetGadgetText(#state,"Speichern...")
WindowEvent()
If GetExtensionPart(save$)=""
save$+"."+extend
EndIf
Select GetExtensionPart(save$)
Case "bmp"
SaveImage(2,save$,#PB_ImagePlugin_BMP)
Case "jpg"
UseJPEGImageEncoder()
SaveImage(2,save$,#PB_ImagePlugin_JPEG)
Case "png"
UsePNGImageEncoder()
SaveImage(2,save$,#PB_ImagePlugin_PNG)
Case "htm"
Goto html:
Case "html"
html:
UseImage(2)
filesize=(28*ImageWidth()*ImageHeight())/1024
If filesize>1000
MessageRequester("Warnung!","Achtung, die zu erzeugende html-seite wird über "+Str(filesize)+"kb groß sein, das würde bedeuten, das ein Modemnutzer sie in bestenfalls "+Str((filesize/(56/8))/60)+"min öffnen könnte.", #MB_OK|#MB_ICONWARNING)
EndIf
DeleteFile(save$)
OpenFile(1,save$)
WriteString("<html><head><title>"+GetFilePart(image$)+"</title></head><body><center><table cellspacing=0 cellpadding=0 Width="+Str(ImageWidth())+" Height="+Str(ImageHeight())+">")
For y=0 To ImageHeight()
WriteStringN("<tr>")
For x=0 To ImageWidth()
WindowEvent()
WriteStringN("<td bgcolor="+Chr(34)+html_hex(Bild(x,y))+Chr(34)+"></td>")
Next
WriteStringN("</tr>")
Next
WriteStringN("</table></center></body></html>")
CloseFile(1)
EndSelect
SetGadgetText(#state,"Gespeichert!")
RunProgram(save$)
EndIf
GadgetID=500
ElseIf GadgetID=#rec
SetGadgetText(#Text_1,"Durchläufe: "+Str(GetGadgetState(#rec)))
ElseIf GadgetID=#mosaik
SetGadgetState(#verwisch,0)
SetGadgetState(#rec,1)
SetGadgetText(#Text_1,"Durchläufe: "+Str(GetGadgetState(#rec)))
DisableGadget(#rec,1)
DisableGadget(#check,0)
DisableGadget(#groesse,0)
DisableGadget(#kant,0)
DisableGadget(#Text,1)
DisableGadget(#font,1)
ElseIf GadgetID=#verwisch
SetGadgetState(#mosaik,0)
DisableGadget(#check,1)
DisableGadget(#rec,0)
DisableGadget(#groesse,1)
DisableGadget(#kant,1)
DisableGadget(#Text,1)
DisableGadget(#font,1)
ElseIf GadgetID=#groesse
SetGadgetText(#groesse,Str(GetGadgetState(#groesse)))
ElseIf GadgetID=#random
SetGadgetState(#rec,1)
DisableGadget(#Text,1)
DisableGadget(#check,1)
DisableGadget(#rec,1)
DisableGadget(#groesse,1)
DisableGadget(#kant,1)
DisableGadget(#font,1)
ElseIf GadgetID=#ascii
DisableGadget(#Text,0)
DisableGadget(#check,1)
DisableGadget(#rec,1)
DisableGadget(#groesse,1)
DisableGadget(#kant,1)
DisableGadget(#font,0)
ElseIf GadgetID=#font
If FontRequester(FontName,FontSize,0)
FontName=SelectedFontName()
FontSize=SelectedFontSize()
FontStyle=SelectedFontStyle()
LoadFont(1,FontName,FontSize,FontStyle)
EndIf
GadgetID=500
ElseIf GadgetID=#print
SetGadgetText(#state,"Sende Bild an Drucker...")
If PrintRequester()
StartPrinting("Farbmix-"+image$)
StartDrawing(PrinterOutput())
;MessageRequester("Info","Breite:"+Str(PrinterPageWidth())+" Höhe:"+Str(PrinterPageHeight()))
DrawImage(UseImage(2),0,0,PrinterPageWidth(),(PrinterPageWidth()/ImageWidth())*ImageHeight())
StopDrawing()
StopPrinting()
SetGadgetText(#state,"Gedruckt!")
Else
SetGadgetText(#state,"Druckvorgang erfolglos")
EndIf
GadgetID=500
ElseIf GadgetID=#kant
SetGadgetState(#check,1)
ElseIf GadgetID=#undo
SetGadgetText(#state,"Bild zurücksetzen")
CopyImage(3,1)
ReloadImage(1)
CopyImage(1,2)
CopyImage(1,0)
ResizeImage(0,GadgetWidth(#Image_1),GadgetHeight(#Image_1))
SetGadgetState(#Image_2,UseImage(0))
SetGadgetText(#state,"Fertig")
DisableGadget(#undo,1)
GadgetID=500
EndIf
Until Event = #PB_EventCloseWindow
End