IncludeBinary statt mit festem String + variablen Dateinamen

Anfängerfragen zum Programmieren mit PureBasic.
Heinz Mendax
Beiträge: 50
Registriert: 29.03.2013 12:25
Wohnort: Eisenach

IncludeBinary statt mit festem String + variablen Dateinamen

Beitrag von Heinz Mendax »

Hallo !
Ich möchte das Programmbeispiel CatchImage_Example so
verändern, das immer unterschiedliche Bilder geladen werden
können. Ich hatte mir das so gedacht, dass mit FileName$ = OpenFileRequester("...
ein beliebiges Bild geladen werden kann und mit

Code: Alles auswählen

DataSection
  Beispielbild:
  IncludeBinary FileName$
EndDataSection
geladen werden könnte. Include verlangt aber feste Strings. Daraufhin hatte ich
die Idee

Code: Alles auswählen

DataSection
  Beispielbild:
  IncludeBinary "c:\temp\anaglyphe.bmp" 
EndDataSection
einzugeben und das geladene File FileName$ in "c:\temp\anaglyphe.bmp" umzunennen.
Das Programm läuft auch ab,es wird aber immer die selbe Datei bearbeitet, scheinbar kommt
die Umnennung zu spät, obwohl sie am Anfang des Programmes steht.

welche Möglichkeit gibt es, IncludeBinary mit im Programm gewählten Dateien zu verbinden ?

__________________________________________________
Code-Tags hinzugefügt
23.02.2016
RSBasic
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: IncludeBinary statt mit festem String + variablen Datein

Beitrag von ts-soft »

Es ist egal, wo das IncludeBinary im Code steht, es ist eine Compiler-Anweisung und wird unmittelbar beim Compilieren
und nicht während der Runtime ausgeführt. Da mußte Dir schon was anderes einfallen lassen :)

Gruß
Thomas
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
Heinz Mendax
Beiträge: 50
Registriert: 29.03.2013 12:25
Wohnort: Eisenach

Re: IncludeBinary statt mit festem String + variablen Datein

Beitrag von Heinz Mendax »

Das hört sich so an, als gäb es nichts dagegen. Kann man vieleicht die Stellen im
Speicher,wo die Strings "c:\temp\anaglyphe.bmp" und FileName$ abgelegt sind
einfach austauschen oder ähnliches ?
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: IncludeBinary statt mit festem String + variablen Datein

Beitrag von Macros »

Hallo Heinz,

CatchImage lädt Bilder aus dem Speicher, Mit IncludeBinary liegt das Bild mit deinem Programm im Speicher.
Nach dem Kompilieren änder sich dann nichts mehr am Bild.

Willst du verschiedene Bilder während der Laufzeit laden nimm Loadimage.

Ein kleines Beispiel:

Code: Alles auswählen

; Das erlaubt uns auch PNG Bilder zu laden, Es gibt auch einen UseJPEGImageDecoder() und andere
UsePNGImageDecoder()

Pattern$ = "Bitmap oder PNG Dateien (*.bmp,*.png)|*.bmp;*.png|Alle Dateien (*.*)|*.*"
  Pattern = 0    ; wir verwenden den ersten von zwei möglichen Pattern als Standard
  File$ = OpenFileRequester("Bitte Bild zum Laden auswählen", StandardFile$, Pattern$, Pattern)
  
  If File$=""
    MessageRequester("Fehler","Keine Datei gewählt, beende")
    End
  EndIf
  
  ; Hier wird das Bild geladen
  LoadImage(1, File$)
  
  ; Breite und Höhe abfragen um das Bild dann anzuzeigen.
  w=ImageWidth(1)
  ; Vorsicht, das Fenster sollte nicht größer als der Bildschirm werden.
  If w>800 
    w=800
  EndIf
  
  h=ImageHeight(1)
  If h>600
    h=600
  EndIf
  
  ; Ein Fenster um das Bild anzuzeigen.
  OpenWindow(1,0,0,w+10,h+10,"Bild",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  ImageGadget(1,5,5,w,h,ImageID(1))
  ; Die Eventschleife für das Fenster
  Repeat
    event=WaitWindowEvent()
  Until event=#PB_Event_CloseWindow
Bild
Heinz Mendax
Beiträge: 50
Registriert: 29.03.2013 12:25
Wohnort: Eisenach

Re: IncludeBinary statt mit festem String + variablen Datein

Beitrag von Heinz Mendax »

Hallo Macros !

Ich möchte das geladene Bild nicht anzeigen, sondern benötige die Farbinformationen
RGB jedes einzelnen Pixels, um Farbrechnungen zu machen. Nach den
Rechnungen sollen die veränderten Pixel wieder zum Bild gespeichert werden.
Ich hatte den Eindruck, das wenn das Bild bereits im Speicher ist, die Pixel und
deren Farben umso leichter zugänglich sind.
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: IncludeBinary statt mit festem String + variablen Datein

Beitrag von Macros »

Nachdem du Load Image ausgeführt hast, ist das Bild auch im Speicher.

Hier noch ein Beispiel, wie du Pixel verändern kannst.

Code: Alles auswählen

; Das erlaubt uns auch PNG Bilder zu laden, Es gibt auch einen UseJPEGImageDecoder() und andere
UsePNGImageDecoder()

Pattern$ = "Bitmap oder PNG Dateien (*.bmp,*.png)|*.bmp;*.png|Alle Dateien (*.*)|*.*"
Pattern = 0    ; wir verwenden den ersten von zwei möglichen Pattern als Standard
File$ = OpenFileRequester("Bitte Bild zum Laden auswählen", StandardFile$, Pattern$, Pattern)

If File$=""
  MessageRequester("Fehler","Keine Datei gewählt, beende")
  End
EndIf



; Hier wird das Bild geladen
LoadImage(1, File$)

; Breite und Höhe des Bildes abfragen
w=ImageWidth(1)
h=ImageHeight(1)

; brauchen wir um auf den Bild zu Zeichnen, oder Farben abzufragen
StartDrawing(ImageOutput(1))
; gehe das Bild Pixel für Pixel durch
For x=0 To w-1
  For y=0 To h-1
    ; Frage Farbe für den Pixel ab
    color=Point(x,y)
    ; Invertiere die Farbe
    color= ~color
    ; Male den Pixel (nun ivertiert) an die selbe Stelle
    Plot(x,y,color)
  Next
Next

StopDrawing()


; hier wird das Bild wieder angezeigt, es kann auch stattdessen per SaveImage(1,Dateiname$) gespeichert werden

; Vorsicht, das Fenster sollte nicht größer als der Bildschirm werden.
If w>800 
  w=800
EndIf

If h>600
  h=600
EndIf
; Ein Fenster um das Bild anzuzeigen.
OpenWindow(1,0,0,w+10,h+10,"Bild",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ImageGadget(1,5,5,w,h,ImageID(1))
; Die Eventschleife für das Fenster
Repeat
  event=WaitWindowEvent()
Until event=#PB_Event_CloseWindow
Falls du noch weitere Hilfe brauchst, würde ich dir empfehlen erst mal alle Hilfeseiten von 2D Drawing und Image durchzusehen. Mit Befehlen die du nicht brauchst, musst du dich ja nicht lang beschäftigen.
Dort findest du auch viele schöne Beispielcodes.
Bild
Heinz Mendax
Beiträge: 50
Registriert: 29.03.2013 12:25
Wohnort: Eisenach

Re: IncludeBinary statt mit festem String + variablen Datein

Beitrag von Heinz Mendax »

Hallo Macro !

Vielen Dank für Deine Hilfe. Das Image- Verzeichnis des Codearchives habe ich durchgesehen. Ich hatte schon
eine Variante erstellt, die das Bild in DATA-Zeilen speichert. Das Laden dieses Programmes dauerte je nach
Bild unzusässig lange oder es mussten einige tausend Zeilen kompiliert werden, was nicht zum Ende kam.
Andere Beispiele waren so undurchsichtig bzw. nur in älteren oder neueren PB-Varianten lauffähig.
Das ist auch immer so ein Fall, wenn es plötzlich bestimmte Befehle nicht mehr gibt und man nicht weiß
wodurch man Sie ersetzen könnte. Das sind so die Stolpersteine.

mfG
Heinz
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: IncludeBinary statt mit festem String + variablen Datein

Beitrag von NicTheQuick »

Du sollst nicht ins Codearchiv, sondern in die Hilfe gucken, indem du Purebasic startest und F1 drückst. Dort finden sich auch keine veralteten Befehle.
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: IncludeBinary statt mit festem String + variablen Datein

Beitrag von ts-soft »

Heinz Mendax hat geschrieben:die das Bild in DATA-Zeilen speichert.
Das ist im Prinzip dasselbe wie IncludeBinary, lediglich das Bild muss beim Compilieren nicht mehr vorliegen und
der Source (nur der Source) wird länger. Bringt Dir also gar nichts.

Für Dein Vorhaben wäre also nur LoadImage(...) oder direktes parsen der Bilddatei eine Alternative.

Du musst immer dran denken, PB ist ein Compiler und kein Interpreter. Die arbeiten unterschiedlich!
Den Bildern ist es egal, wie sie in den Speicher gelangen, sie liegen immer im gleichem Format im Speicher vor.

Gruß
Thomas
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
Antworten