MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Beitrag 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
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Beitrag von ts-soft »

PS: UsePNG...() usw. ist Global, also am Anfang einfügen reicht und bitte nicht in eine Procedure packen :)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Beitrag 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?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Beitrag 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.
Zuletzt geändert von ts-soft am 11.06.2015 15:57, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Beitrag 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, ...
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Beitrag 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
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: MeineLokaleURLNutztImForumNichts => SelectExampleImage()

Beitrag von RSBasic »

Oh sorry, wie bin ich denn auf seinen Namen gekommen. Ich habs geändert. :oops:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten