Seite 1 von 1

MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Verfasst: 11.06.2015 14:34
von uweb
LoadImage(#Image, MeineLokaleURLNutztImForumNichts) => LoadImage(#Image, SelectExampleImage())
oder
LoadImage(#Image, MeineLokaleURLNutztImForumNichts) => LoadImage(#Image, SelectImage())


Wenn man nur mal eben jemandem bei seinem Code helfen will bremst es einen unnötig wenn da auf dessen lokale Datei verwiesen wird.
Bei Bildern ist mir das schon öfter passiert. Und jedesmal habe ich die URL von Hand geändert.

Nun habe ich mir dafür zwei FileRequester-Proceduren geschrieben.
Die könnte zwar jeder auch selbst schreiben, aber das habe ich ja nun schon gemacht.
Vielleicht nutzt sie ja sogar der eine oder andere in seinem Code um es anderen leichter zu machen.

Da sie sehr einfach sind und ich mich damit nicht in Tips&Tricks traue formuliere ich es mal als Frage :
Hat jemand Verbesserungsvorschläge ?
bzw als Bitte :
Würde das bitte jemand unter OSX und Linux testen.

Code: Alles auswählen

EnableExplicit

Procedure.s SelectExampleImage()
UseJPEG2000ImageDecoder()
UseJPEG2000ImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
  Protected.s result
  Static.s ImagePattern = "All supported formats|*.bmp;*.jpg; *.jpeg; *.wmf; *.emf; *.png;*.tif;*.tiff;*.tga|TGA image (*.tga)|*.tga|TIF image (*.tif)|*.tif|TIFF image (*.tiff)|*.tiff|PNG image (*.png)|*.png|BMP image (*.bmp)|*.bmp|JPEG image (*.jpg;*.jpeg)|*.jpg;*.jpeg|GIF image (*.gif)|*.gif"
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    result = OpenFileRequester("SELECT IMAGE",#PB_Compiler_Home+"Examples\Sources\Data\*.*",ImagePattern,0)
  CompilerElse
    result = OpenFileRequester("SELECT IMAGE",#PB_Compiler_Home+"Examples/Sources/Data/*.*",ImagePattern,0)
  CompilerEndIf 
  ProcedureReturn result
EndProcedure

Procedure.s SelectImage()
UseJPEG2000ImageDecoder()
UseJPEG2000ImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
  Protected.s result
  Static.s ImagePattern = "All supported formats|*.bmp;*.jpg; *.jpeg; *.wmf; *.emf; *.png;*.tif;*.tiff;*.tga|TGA image (*.tga)|*.tga|TIF image (*.tif)|*.tif|TIFF image (*.tiff)|*.tiff|PNG image (*.png)|*.png|BMP image (*.bmp)|*.bmp|JPEG image (*.jpg;*.jpeg)|*.jpg;*.jpeg|GIF image (*.gif)|*.gif"
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    result = OpenFileRequester("SELECT IMAGE",GetHomeDirectory() + "Pictures\*.*",ImagePattern,0)
    ; alternativ GetHomeDirectory() + "Pictures/"  
  CompilerElse
    result = OpenFileRequester("SELECT IMAGE",GetHomeDirectory() + "Pictures/*.*",ImagePattern,0)
  CompilerEndIf 
  ProcedureReturn result
EndProcedure

;LoadImage(0, SelectExampleImage())
;LoadImage(1, SelectImage())

Debug SelectExampleImage()
Debug SelectImage()
edit : ImageDecoder hinzugefügt

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Verfasst: 11.06.2015 15:11
von Kiffi
gute Idee! :allright:

Allerdings kann es mühselig sein, jedes mal erneut die Bilder auszuwählen. Mein Lösungsansatz ist deshalb folgender:

Es gibt einen Service namens lorempixel (http://lorempixel.com/), der für Testzwecke Beispielbilder zur Verfügung stellt.

Hierbei kann man für das anzufordernde Bild neben Höhe und Breite des benötigten Bildes auch noch einige andere Parameter (Farbig/SW, Kategorie, Text) angeben (das habe ich jetzt hier für den schnellen Hack nicht gemacht; wer mag, kann das ja ergänzen).

Die Prozedur LoremImage() unten ist ähnlich wie LoadImage() aufzurufen (nur eben ohne Pfad).

Code: Alles auswählen

EnableExplicit

UseJPEGImageDecoder()

Procedure LoremImage(Image, Width=100, Height=100)
  
  InitNetwork()
  
  Protected ReturnValue
  Protected TempFileName.s = GetTemporaryDirectory() + "LoremImage" + Str(ElapsedMilliseconds()) + ".jpg"
  
  If ReceiveHTTPFile("http://lorempixel.com/" + Str(Width) + "/" + Str(Height) + "/", TempFileName)
    ReturnValue = LoadImage(Image, TempFileName)
    DeleteFile(TempFileName)
  EndIf
  
  ProcedureReturn ReturnValue
  
EndProcedure

OpenWindow(0, 0, 0, 430, 430, "LoremImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

; hier mit fester Image-Nummer 0

If LoremImage(0, 200, 200)
  ImageGadget(0,  10, 10, 200, 200, ImageID(0))
  ImageGadget(1, 220, 10, 200, 200, ImageID(0), #PB_Image_Border)
  FreeImage(0)
EndIf

; hier mit #PB_Any

Define myImage = LoremImage(#PB_Any, 200, 200)

If myImage
  ImageGadget(2,  10, 220, 200, 200, ImageID(myImage))
  ImageGadget(3, 220, 220, 200, 200, ImageID(myImage), #PB_Image_Border)
  FreeImage(myImage)
EndIf

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Grüße ... Peter

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Verfasst: 11.06.2015 15:36
von ts-soft
PS: UsePNG...() usw. ist Global, also am Anfang einfügen reicht und bitte nicht in eine Procedure packen :)

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Verfasst: 11.06.2015 15:42
von uweb
Danke für euer Feedback!

@Peter :
Ja, es wäre besser wenn man Deine Lösung oder Verweise auf Bilder aus den PB-Beispielen in den Codes im Forum wiederfinden würde.
Dann hätte man gar keine Arbeit mehr damit.

@ts-soft
Ich habe mich schon gefragt ob das eine gute Idee ist - aber keinen Nachteil gesehen. Der Vorteil ist der, dass ich mal eben schnell die Procedure oben rein kopieren und dann alle lokalen URL's gegen SelectExampleImage() oder SelectImage() austauschen kann. Was spricht denn dagegen?

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Verfasst: 11.06.2015 15:55
von ts-soft
Das ist eine Compiler-Anweisung die Lib zu nutzen. Einmal genügt und es sieht einfach nur K..ke. aus in einer Procedure.
Wie von einem Nichtversteher :mrgreen:
Ich weiß auch nicht, ob die Lib jetzt mehrmals in den Code geladen wird. Init... wird neuerdings nur einmal ausgeführt.

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Verfasst: 11.06.2015 15:56
von RSBasic
Gute Idee :allright:
Aber da müsste man den aus dem Internet kopierten Quellcode trotzdem anpassen.
Ist da ein Macro nicht besser?
Zum Beispiel so:

Code: Alles auswählen

EnableExplicit

;====================================================================================================
UseJPEGImageDecoder()

;Kiffis Prozedur zum Herunterladen und Laden einer Grafik
Procedure LoremImage(Image, Width=100, Height=100)
  InitNetwork()
  
  Protected ReturnValue
  Protected TempFileName.s = GetTemporaryDirectory() + "LoremImage" + Str(ElapsedMilliseconds()) + ".jpg"
  
  If ReceiveHTTPFile("http://lorempixel.com/" + Str(Width) + "/" + Str(Height) + "/", TempFileName)
    ReturnValue = LoadImage(Image, TempFileName)
    DeleteFile(TempFileName)
  EndIf
  
  ProcedureReturn ReturnValue
EndProcedure

Macro LoadImage(Image, FileName, Flags)
  LoremImage(Image)
EndMacro

;====================================================================================================
;-Oberen Code einfügen, keine Anpassung des nachfolgenden Codes notwendig

UsePNGImageDecoder()

Define ImageID

LoadImage(1, "Bild1.png", 0)
LoadImage(2, "Bild2.png", 0)
ImageID = LoadImage(#PB_Any, "Bild3.png", 0)

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ImageGadget(1, 10, 10, 0, 0, ImageID(1), 0)
  ImageGadget(2, 10, 120, 0, 0, ImageID(2), 0)
  ImageGadget(3, 10, 230, 0, 0, ImageID(ImageID), 0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Verfasst: 11.06.2015 16:32
von uweb
Danke für das Teamwork!
Es ist sehr produktiv wenn nicht Sinn und Zweck in Frage gestellt sondern an Lösungen gebastelt wird.

@ts-soft
Ja, schön ist es nicht. Aber wenn z.B. schon UsePNGImageEncoder im Code steht wollte ich nicht noch nach einer PNG suchen sondern das erste Bild das ich finde verwenden.
Wie Peter schon geschrieben hat kann der FileRequester auch so schon mühselig werden.
Dass nur der benötigte Decoder eingebunden und der automtisch erkannt wird habe ich natürlich vorher gecheckt.

Mit dem Nichtversteher hast Du nicht ganz unrecht. Ich komme nur selten dazu mich mit PB zu beschäftigen und vergesse schnell.
Aber das ist ja einer der Vorteile von PB. Ich habe vor langer Zeit auch schon in Assembler, Cobol, C, C++ und Java programmiert.
Bei denen wird man fürs Nicht-am-Ball-bleiben sehr viel härter bestraft.


@RSBasic
JA !
Das dürfte der Königsweg sein.

@all
Vielleicht lässt sich das ja noch ausbauen - z.B. Dummy-Texte, Musik, ...

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Verfasst: 11.06.2015 21:57
von HeX0R
RSBasic hat geschrieben:

Code: Alles auswählen

[...]
;NicTheQuicks Prozedur zum Herunterladen und Laden einer Grafik
Procedure LoremImage(Image, Width=100, Height=100)
Ähm, das war Kiffi

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Verfasst: 11.06.2015 21:59
von RSBasic
Oh sorry, wie bin ich denn auf seinen Namen gekommen. Ich habs geändert. :oops: