Problem mit eigenem Bilddateiformat

  • GM 8
  • Problem mit eigenem Bilddateiformat

    Also ich kom nicht auf den Fehler:
    Zum Speichern

    GML-Quellcode

    1. file=file_text_open_write('posor.txt') // Ausgabe datei anlegen
    2. // Farben auslesen
    3. pos=1
    4. row=1
    5. numb=0
    6. text=""
    7. repeat (new_width*new_height)
    8. {
    9. posor[numb]=draw_getpixel(x+pos,y+row) // Pixelweise auslesen
    10. text+=string(chr(color_get_red(posor[numb])))+string(chr(color_get_green(posor[numb])))+string(chr(color_get_blue(posor[numb])))
    11. if pos<new_width
    12. {
    13. pos+=1
    14. } // Zeile und Spalte
    15. else
    16. {
    17. pos=1
    18. row+=1
    19. file_text_write_string(file,text)
    20. file_text_writeln(file)
    21. text=""
    22. } // Zeile und Spalte
    23. numb+=1 // Nächster Pixel
    24. }
    25. file_text_close(file) // Ausgabedatei schließen
    26. show_message("Datei Fertig!") // Die posor.txt ist fertig
    Alles anzeigen

    Zum laden

    GML-Quellcode

    1. xx=1
    2. yy=1
    3. file=file_text_open_read('posor.txt') // Datei zum Auslesen
    4. s=surface_create(500,500)
    5. surface_set_target(s)
    6. draw_clear_alpha(0,0)
    7. // Farben auslesen
    8. while not (file_text_eof(file)) // Solange es Zeilen gibt, weiter lesen
    9. {
    10. kette=file_text_read_string(file) // Zeile auslesen und so color, x und y bestimmen
    11. for(p=1;p<string_length(kette)-3;p+=3)
    12. {
    13. color=string_copy(kette,p,p+2)
    14. color=make_color_rgb(ord(string_char_at(color,1)),ord(string_char_at(color,2)),ord(string_char_at(color,3)))
    15. draw_point_color(x+xx,y+yy,color) // Pixel malen
    16. xx+=1
    17. }
    18. file_text_readln(file) // Neue Zeile
    19. yy+=1
    20. xx=1
    21. }
    22. file_text_close(file) // Ausgabedatei schließen
    23. surface_reset_target()
    24. sleep(1000)
    25. // Sprite von der Surface erstellen
    26. new_sprite=sprite_create_from_surface(s,x,y,xx,yy,false,false,0,0)
    27. show_message('Bild Fertig!') // Hui! Das Bild ist Fertig!
    28. sprite_index=new_sprite // Dem object das neue Bild zuweisen
    Alles anzeigen

    Das Speichern funktioniert scheinbar :huh: jedoch tut sich beim Laden gar nichts???
    Woran liegts?

    Ich speichere die rot-grün-blau vektoren als ingesamt drei zeichen ab.
    Eine horizontale Pixel-"bahn" ist dann auch eine Zeile in der Datei mit der Länge der Zeichen: Breite*3
  • Du solltest vl besser mit binären Files arbeiten, da gibts weniger so "format" Probleme...
    Warum surface mit 500 * 500? Woher weist du das? Beim speichern schreibst ja mit new_width * new_height
    Ausserdem überprüf mal beim laden die Position p, die einzelnen Farben die rauskommen sollten..
    Debug dich mal durchs komplette Speichern und Laden mit show_messages zwischendrinn oder so... Oder schreibs noch mal neu, dann sind die Fehler meistens behoben ;D
    "das war meine letzte flamewar PM an dich ."
  • Das 500*500 ist jetzt nur mal zum Test gewesen und gibts für binäre Dateien ein Tutorial?
    Ich hab nämlich null Ahnung davon. :S
    http://www.gm-d.de/help/hh_start.htm?410_01_files.html

    Für mich mach das das keinen Sinn:

    GML-Quellcode

    1. color=string_copy(kette,p,p+2)
    2. //string_copy(string,index,count) also
    3. color=string_copy(kette,p,2)
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von henrik1235 ()

  • Damit soll er immer um 3 Zeichen weiter hüpfen, oder stimmt der Code fürs Hüpfen nicht?
    Der Link war hilfreich! danke

    Nun hab ich mich ans werk gemacht und stoße auf ein Problem:

    GML-Quellcode

    1. spr=argument0
    2. subimg=argument1
    3. fname=argument2
    4. w=sprite_get_width(spr)
    5. h=sprite_get_height(spr)
    6. xx=0
    7. yy=0
    8. sTmp=surface_create(w,h)
    9. surface_set_target(sTmp)
    10. draw_clear_alpha(0,0) /////Beschreiben der temporalen Surface mit dem Sprite
    11. draw_sprite(spr,subimg,0,0)
    12. surface_reset_target()
    13. file=file_bin_open(fname,1) /////Öffnet die zu beschreibende Datei
    14. repeat(w*h)
    15. {
    16. pixel=surface_getpixel(sTmp,xx,yy)
    17. file_bin_write_byte(file,color_get_red(pixel))
    18. file_bin_write_byte(file,color_get_green(pixel))
    19. file_bin_write_byte(file,color_get_blue(pixel))
    20. if xx<w
    21. {
    22. xx+=1
    23. }
    24. else
    25. {
    26. xx=0
    27. yy+=1
    28. }
    29. }
    30. file_bin_close(file)
    31. surface_free(sTmp)
    Alles anzeigen

    Nur wie kann ich ihm noch eine Breite/Höhe hinzufügen (in normaler Form, also dezimal)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von whiterock ()

  • Probier es mal mit folgenden Scripts:

    file_bin_write_int:

    GML-Quellcode

    1. // argument0 = file
    2. // argument1 = integer (unsigned)
    3. // argument2 = bytes
    4. if (argument2 > 1) {
    5. file_bin_write_int(argument0,argument1 >> 8,argument2-1);
    6. }
    7. file_bin_write_byte(argument0,argument1 mod 256);


    file_bin_read_int:

    GML-Quellcode

    1. // argument0 = file
    2. // argument1 = bytes
    3. if (argument1 == 0) {
    4. return 0;
    5. }
    6. return (file_bin_read_int(argument0,argument1-1) << 8) + file_bin_read_byte(argument0);

    Ist ungetestet und funktioniert nur für nichtnegative ganze Zahlen. Für das Argument "bytes" sollte ein Wert von 4 reichen. Das ist die Anzahl Bytes, die für das Speichern der Zahl genutzt werden. Wichtig ist nur, dass du da bei file_bin_write_int und file_bin_read_int die gleichen Werte angibst.
  • Danke, das Einlesen und Schreiben meines Dateiformats funktioniert aber dauert einwenig :(

    Liegt wohl an der zwingenden Repeat Schleife beim speichern, das Laden geht nämlich schneller :|

    P.S. Mein dateiformat hat die selbe Qualität wie Bitmaps ist aber kleiner :thumbup: , aber keiner hat ein Programm mit dem er es öffnen kann :thumbdown:
  • Benutzer online 1

    1 Besucher