Image in Sprite umwandeln und umgekehrt

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Image in Sprite umwandeln und umgekehrt

Beitrag von benpicco »

Gibt es eine schnelle Möglichkeit, ein Image in ein Sprite bzw. ein Sprite in ein image umzuwandeln? Bisher habe ich das immer mit Zwischenspeichern und neuladen gelöst /:->
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

mit StartDrawing() und DrawImage() kann man ein Image ganz leicht auf einem Sprite zeichnen ... gibt aber alleine hier im Forum einige schnellere lösungen ... musste nur mal nach "Sprite Image" suchen (dabei die Suche auf "alle Wörter suchen" stellen), dann wirst du schnell fündig.

Und für die andere variante wars schon schwerere ... aber gott sei dank bin ich im Englischen Forum fündig geworden, war glaub ich sogar von Freak die Prozedur. Such mal im Englischen Forum nach "Sprite Image" ... dann sollteste das ebenfals schnell finden.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Ich frag mich immer wieder, warum Image überhaupt gebraucht wird. Das könnte man doch durch Sprite ersetzen, oder würde das dann nicht mehr mit WinAPI-Befehlen hinhauen? :?
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

@hardfalcon
> Ich frag mich immer wieder, warum Image überhaupt gebraucht wird.
weil images ohne directx funktionieren. :wink:

alles hat so seine dasein berechtigung, Sprite 2D, Sprite3D & Images. für jede situation gibt es das passende und sollte auch nicht durch etwas anderes ersetzt/emuliert werden.

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Bild
Ich hab folgenden Code von Hroudtwolf gefunden:

Code: Alles auswählen

  Sprite.l=999 
  GrabSprite(Sprite.l,0,0,1024,768) 
  hDC=StartDrawing(SpriteOutput(Sprite.l)) 
  bmp.BITMAP\bmWidth=SpriteWidth(Sprite.l) 
  bmp\bmHeight=SpriteHeight(Sprite.l) 
  bmp\bmPlanes=1 
  bmp\bmBitsPixel=GetDeviceCaps_(hDC,#BITSPIXEL) 
  bmp\bmBits=DrawingBuffer() 
  bmp\bmWidthBytes=DrawingBufferPitch() 
  hBmp.l=CreateBitmapIndirect_(bmp) 
  StopDrawing()  
Also wenn ich das richtig verstanden habe, ist hBmp.l die ImageID, oder?
Danke
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Wenn du die PB ID meinst , nein . hBmp ist in dem Fall
das Handle des Bitmaps.

Hier ist das ganze nochmal mit Beispielen.
http://forums.purebasic.com/english/vie ... hp?p=81639
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Nein, ich meine schon das Ergebniss von ImageID(), also die handle ^^.
hab´s auch schon auspropiert, es funktioniert prächtig!
Wow, der beitrag im Englishen Forum beantwortet ja geanu, was ich gefragt habe :o. Ok, in zukunft werde ich besser suchen...
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Ok, jetzt brauche ich ja doch noch die PB ID, da copyimage sicher schneller ist als startdrawing(imageoutput()): drawimage(hbmp,0,0):stopdrawing()
Oder gibt es eine Möglichkeit, den Code so zu ändern, das man hBMP vorher bestimmen kann?
Und wo ich schon mal frage, kennt jemand eine weitere Möglichkeit, diesen code zu optimieren? Es geht vor allem um die Prozeduren reloadImage() und RedrawImage(). Und nochetwas: Der Debugger meldet sich manchmal, das liegt am (eigentlich unnötigen :roll:) scrollenden Fenstertitel. Seltsamerweise funktioniert ohne debugger alles...

Code: Alles auswählen

;Thanks to SoS Deem2031 S.M. and Hroudtwolf
OnErrorResume()
Global ThreadID.l
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
Dim Bild.l(1,1)
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 RedrawImage(Image)
  UseImage(Image)
  CreateSprite(1,ImageWidth(),ImageHeight())
  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 
          
          rgb=Bild(x-1,y-1)
          bgr=(((rgb & $FF) << 16)|(((rgb >>8 ) & $FF)<<8)|((rgb >>16) & $FF)) 
          PokeL(*buffer+4*Z+z2,bgr)
      Case #PB_PixelFormat_32Bits_RGB 
          PokeL(*buffer+4*Z+z2,Bild(x-1,y-1)) 
      EndSelect 
      ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 
      
      Z+1 
    Next 
    Z = 0 
    z2 + pitch 
  Next 
  StopDrawing()
  hDC=StartDrawing(SpriteOutput(1)) 
  bmp.BITMAP\bmWidth=Width
  bmp\bmHeight=Height
  bmp\bmPlanes=1 
  bmp\bmBitsPixel=GetDeviceCaps_(hDC,#BITSPIXEL) 
  bmp\bmBits=DrawingBuffer() 
  bmp\bmWidthBytes=DrawingBufferPitch()
  hBmp.l=CreateBitmapIndirect_(bmp) 
  StopDrawing() 
  UseImage(Image)
  StartDrawing(ImageOutput())
  DrawImage(hBmp,0,0)
  StopDrawing()
  DeleteObject_(hBmp)
 ;CopyImage(hBmp,Image)
 

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
Procedure ReloadImage(Image)
  PauseThread(ThreadID)
  If sprite=1
  FlipBuffers()
  UseImage(Image)
  Dim Bild.l(ImageWidth(),ImageHeight())
  If sprite=1
    UseImage(Image)
    CreateSprite(1,ImageWidth(),ImageHeight())
   ;SaveImage(Image,GetTempPath()+"\temp.bmp")
  ;LoadSprite(1,GetTempPath()+"\temp.bmp")
  StartDrawing(SpriteOutput(1)) 
  DrawImage(UseImage(Image),0,0)
  *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) 
          ;PokeL(*buffer+4*Z+z2,bgr)
          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
Else
UseImage(TargetIMG)
StartDrawing(ImageOutput())
  For y=1 To ImageHeight()
    For x=1 To ImageWidth()
      Plot(x,y,Bild(x,y))
    Next
  Next
  StopDrawing()
EndIf

ResumeThread(ThreadID)
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
        Bild(x,y)=RGB(red,green,blue)
        If enableprogress=1
          count+1
          progress.f=(count/(ImageHeight()*ImageWidth()))*100
          SetGadgetState(#ProgressBar,progress)
        EndIf
      EndIf
    Next
  Next
  RedrawImage(TargetIMG)
  ;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)
  Width=ImageWidth()
  Height=ImageHeight()
  ;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)
      For a=0 To groesse+zw
        For b=0 To groesse+zw
          If x+b<Width And y+a<Height
            Bild(x+b,y+a)=RGB(red,green,blue)
          EndIf
        Next
      Next
      
      If mode=1
        farbe.l=RGB(red/1.5,green/1.5,blue/1.5)
        Bild(x,y)=farbe
        For Z=1 To groesse
          If x+Z<Width And y+groesse<Height
          Bild(x+Z,y)=farbe
          Bild(x+Z,y+groesse)=RGB(Red(farbe)/Z,Green(farbe)/Z,Blue(farbe)/Z)
          EndIf
        Next
        For Z=1 To groesse
          If x+groesse<Width And y+Z<Height
          Bild(x,y+Z)=farbe
          Bild(x+groesse,y+Z)=RGB(Red(farbe)/Z,Green(farbe)/Z,Blue(farbe)/Z)
        EndIf
        Next
      EndIf
      x+groesse

    Next
    y+groesse
  Next
  RedrawImage(TargetIMG)
  ;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)
  
  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
      Bild(x,y)=RGB(Random(Red(Bild(x,y))),Random(Green(Bild(x,y))),Random(Blue(Bild(x,y))))
    Next
  Next
  RedrawImage(TargetIMG)
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")
      SetGadgetState(#kant,1)
      SetGadgetState(#check,1)
    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)
ThreadID=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

  

image$="c:\"
Repeat
  Delay(0)
  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",GetPathPart(image$),"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)
    SetGadgetState(#rec,1)
    SetGadgetText(#Text_1,"Durchläufe: "+Str(GetGadgetState(#rec)))
  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
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Antworten