Seite 1 von 1

IncludeBinary statt mit festem String + variablen Dateinamen

Verfasst: 23.02.2016 19:57
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

Re: IncludeBinary statt mit festem String + variablen Datein

Verfasst: 23.02.2016 20:37
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

Re: IncludeBinary statt mit festem String + variablen Datein

Verfasst: 23.02.2016 21:00
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 ?

Re: IncludeBinary statt mit festem String + variablen Datein

Verfasst: 23.02.2016 21:04
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

Re: IncludeBinary statt mit festem String + variablen Datein

Verfasst: 23.02.2016 23:07
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.

Re: IncludeBinary statt mit festem String + variablen Datein

Verfasst: 23.02.2016 23:25
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.

Re: IncludeBinary statt mit festem String + variablen Datein

Verfasst: 24.02.2016 00:03
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

Re: IncludeBinary statt mit festem String + variablen Datein

Verfasst: 24.02.2016 01:11
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.

Re: IncludeBinary statt mit festem String + variablen Datein

Verfasst: 24.02.2016 11:03
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