|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
csde_rats
Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 25.01.2007, 19:07 Titel: PUT Bilder mit AK-Lib |
|
|
Hi Leute,
Ich möchte bereits vorhandene 24-Bit Bitmaps umwandeln (ohne Farbverlust) in Dateien, welche ich mit den XPUT-Befehl von der AK-Lib anzeigen kann. Ich habe es bereits damit versucht, das ganze Bild zu GETten, und mit PUT #1, bild$ in eine datei zu schreiben. Dies hat bei mir aber nicht funktioniert, eine Fehlermeldung, darüber, dass der STRING-Speicherplatz nicht ausreicht, kam. Weiß jemand wie ich das evtl. auch mit den AK-EMS-Funktionen hinkriegen kann??? _________________ If hilfreicher_Beitrag then klick(location.here)
Klick
Zuletzt bearbeitet von csde_rats am 14.07.2007, 19:20, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
A.K.
Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 25.01.2007, 23:28 Titel: |
|
|
Hi,
was genau hast du vor? Die Umwandlung von einer 24Bit-Datei in eine andere 24Bit-Datei macht für mich jetzt erstmal nicht sooo viel Sinn.
Könntest du evtl. beschreiben was das Ziel sein soll dieser Umwandlung?
"STRING-Speicherplatz reicht nicht"
Das liegt daran das Strings nur eine bestimmte Größe haben in QB. Und ein komplettes Bild passt da meistens nicht rein.
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
|
csde_rats
Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 26.01.2007, 15:57 Titel: |
|
|
Hi,
Ich möchte die BMP-Bilder umwandeln in Dateien die NICHT jeder lesen kann. Achja, in der Readme hast du geschreiben das der Header$ aus 3 ASCII-Zeichen besteht, und diesen Header möchte ich auch entfernen. Den Header kann man ja ziemlich simpel vor die Bilddaten klatschen wenn man das Bild anzeigen möchte. Ich kam auf dei Idee das ganze mit einem EMS-Datenfeld zu machen. Nur leider musste ich feststellen das man nicht VOM EMS IN eine Datei schreiben kann. Verstehst du jetzt was ich machen möchte?
PS: Ich weiß zieemlich genau das in keinem dieser Bilder mehr als 900 Farben vorkommen, daher könnte man das doch auch in 16-Bit etc. umwandeln. (Damit logischerweise die Dateien kleiner werden )
PPS: Ich habe nichts gegen eine Lösung mit externen Paletten _________________ If hilfreicher_Beitrag then klick(location.here)
Klick
Zuletzt bearbeitet von csde_rats am 14.07.2007, 19:20, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 26.01.2007, 16:23 Titel: |
|
|
Naja von 24 auf 16 bit runterzugeehen, macht imho nur sinn, wenn du eventuelle ungenauigkeiten in der palette in kauf nimmst. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
csde_rats
Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 26.01.2007, 16:29 Titel: |
|
|
Hi Jojo,
Ne ich meine:
24-Bit sind ungefähr 16.7 Mio Farben.
So von 16.7 Mio farben sind nur 900 benutzt. Mit einer wahrscheinlich nicht allzu großen Pallete (für jedes Bild) dürfte der runtergang auf 16-Bit ausgeglichen sein.
Oder habe ich jetzt einen kleinen Denkfehler gemacht und bin hiermit gegen die gelaufen? _________________ If hilfreicher_Beitrag then klick(location.here)
Klick
Zuletzt bearbeitet von csde_rats am 14.07.2007, 19:20, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 26.01.2007, 16:36 Titel: |
|
|
richtig. denn diese 16,7 mio farben sind genau festgelegt, genau wie bei 16bit die 65536 farben. wenn du z.B. einen farbverlauf aus ganz vielen graustufen besteht, solltest du es in 24bit lassen, da es sonst in 8 bit oder 16 bit (haben beide nur 64 statt 256 farbstufen) nicht mehr fein verteilt sein wird, sondern große balken entstehen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
csde_rats
Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 26.01.2007, 16:39 Titel: |
|
|
Ja abbbbeeer es gibt doch paletten die das festlegen!! oder etwa nicht?? ich meine:
-keine Farbverläufe
-Daher müsste man mit einer Palette doch nur diese 900 Farben neu zuordnen. _________________ If hilfreicher_Beitrag then klick(location.here)
Klick
Zuletzt bearbeitet von csde_rats am 14.07.2007, 19:19, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 26.01.2007, 16:47 Titel: |
|
|
Es geht um die Genauigkeit von 16bit vs 24bit. Bei 16bit gibt es nur 64 verschiedene helligkeitsstufen einer farbe, bei 24 bit allerdings 256. Da kommst du mit kiener palette rum. ich weiß allerdings nicht, ob AKs lib 256 stufen bei 8 bit unterstützen. wenn du allerdings ein spiel programmierst oder sowas, dürfte das mit den 16bit kein problem sein. Aaaaaaaaber: Ich persönlich kenne nur wenige Progs, die 16bit BMPs überhaupt speichern können (um genau zu sein, nur eines) _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
csde_rats
Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 26.01.2007, 17:03 Titel: |
|
|
Ich will eben KEIN BMP erstellen sondern NUR REINE Bilddaten!! Und mit 16/24 Bit MUSS ja nicht sein.
Daher: Ich will einfach nur simpel anzuzeigende Bilder OHNE SET.PICTURE, also mit Code: | xput (0,0,"EMS Bild1"). | Vorher nur noch so was wie:
Code: |
const bpp% = 24
const xlen% = 640
const ylen% = 480
const BildHeader$ = CHR$(bpp%) + MKI$(xlen%) + MKI$(ylen%)
call obj.open ("Bild 1" / "EMS Bild1", objectnummer%)
call obj.put (objectnummer%, 1, BildHeader$)
call xput (0,0,"EMS Bild1")
|
So in etwa. Ich würde AK bitten mir zusagen wie ich das wirklich richtig mache vom lib-Syntax ("Bild1" oder "EMS Bild1" und bei welchen SUB's was??).
=====EDIT====
Ich habe das mal probiert (Code ungetestet):
Code: |
const bpp% = 24
const xlen% = 640
const ylen% = 480
const BildHeader$ = CHR$(bpp%) + MKI$(xlen%) + MKI$(ylen%)
call xscreen (&H111)
call set.picture (0,0,"images\kara.bmp")
call xget (0,0,640,480,"EMS Kara")
call obj.open ("kara.pic", file%)
call obj.put (file%, 1, "EMS Kara")
call obj.close (file%)
call cls(0)
do: loop until inkey$ <> ""
call xerase ("EMS Kara")
call EMS.LOAD.FILE ("kara.pic", "EMS Kara")
call obj.open ("EMS Kara", handle%)
call obj.put (handle%, 1, BildHeader$)
call xput (0,0,"EMS Kara")
call obj.close (handle%)
|
_________________ If hilfreicher_Beitrag then klick(location.here)
Klick
Zuletzt bearbeitet von csde_rats am 14.07.2007, 19:19, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 26.01.2007, 17:41 Titel: |
|
|
csderats hat Folgendes geschrieben: | Ich will eben KEIN BMP erstellen sondern NUR REINE Bilddaten!! |
Klar. es kann auch ne png sein. oder gif. oder jpg. oder...
verstehst du? es gibt ums prinzip der genauigkeit, die letzendlich nicht von der bmp-datei kommt, sondern von der hardware bzw. den spezifikationen. du kannst theoretisch eine 1337bit-grafikdatei machen, aber du musst sie dann eben doch auf 16 oder 24 bit (je nach grafikmodus) runterdithern. verstanden, was ich meine? _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
A.K.
Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 26.01.2007, 17:52 Titel: |
|
|
So,
wenn ich das richtig verstehe geht es also nur darum das andere Leute deine Bilder nicht sollen.
Meistens reicht auch schon ein einfaches Umbenennen der Dateiendung.
Das einzige Problem ist das du dann das Bild nicht mehr direkt mit Set.Picture auf den Bildschirm zeichnen kannst da sich Set.Picture an der Dateiendung orientiert.
Also müsste man das so machen:
1. Benenne die Dateiendung der Bilddatei um. (z.B. ".pic")
2. Bild auf den Bildschirm bringen:
Code: |
OBJ.Open ("dasbild.pic",handle%)
IF handle% = -1 THEN PRINT "Datei existiert nicht": END
SET.Picture.BMP (handle%,x%,y%,"","")
OBJ.Close (handle%
|
oder wenn du das Bild vorher in den EMS laden willst:
2.
Code: |
EMS.Load.File ("dasbild.pic","bild1")
OBJ.Open ("EMS bild1",handle%)
IF handle% = -1 THEN PRINT "Datei existiert nicht": END
SET.Picture.BMP (handle%,x%,y%,"","")
OBJ.Close (handle%
|
Das ist im Grunde genommen das einfachste und schnellste.
Eine andere Möglichkeit wäre ein BMP mit Set.Picture auf den Bildschirm zu bringen und das ganze mit XPUT abzulesen.
Da dies für das ganze Bild aber zu groß ist sollte man jede Zeile einzeln vom Bildschirm lesen und sie auch in eine Datei schreiben. Vorher natürlich den Head in die neue Bilddatei schreiben und vor jeder Zeile dann den XPUT-Head entfernen.
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU*
Zuletzt bearbeitet von A.K. am 26.01.2007, 17:53, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
csde_rats
Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 26.01.2007, 17:53 Titel: |
|
|
@AK
Also den Header mit
Code: |
BildHeader$ = CHR$(24) + MKI$(640) + MKI$(480)
bild$ = bild$ - BildHeader$
|
entfernen _________________ If hilfreicher_Beitrag then klick(location.here)
Klick
Zuletzt bearbeitet von csde_rats am 14.07.2007, 19:19, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
A.K.
Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 26.01.2007, 18:34 Titel: |
|
|
Zitat: |
const bpp% = 24
const xlen% = 640
const ylen% = 480
const BildHeader$ = CHR$(bpp%) + MKI$(xlen%) + MKI$(ylen%)
call xscreen (&H111)
call set.picture (0,0,"images\kara.bmp")
call xget (0,0,640,480,"EMS Kara")
call obj.open ("kara.pic", file%)
call obj.put (file%, 1, "EMS Kara")
call obj.close (file%)
call cls(0)
do: loop until inkey$ <> ""
call xerase ("EMS Kara")
call EMS.LOAD.FILE ("kara.pic", "EMS Kara")
call obj.open ("EMS Kara", handle%)
call obj.put (handle%, 1, BildHeader$)
call xput (0,0,"EMS Kara")
call obj.close (handle%)
|
Der folgende Teil geht leider nicht
Code: |
call xget (0,0,640,480,"EMS Kara")
call obj.open ("kara.pic", file%)
call obj.put (file%, 1, "EMS Kara")
call obj.close (file%)
|
xget, obj.open und obj.close wären richtig.
obj.put klappt so leider nicht da er nun in die Datei "kara.pic" nur die Zeichenfolge "EMS Kara" schreibt und nicht den Inhalt des EMS-Objektes.
Code: |
call EMS.LOAD.FILE ("kara.pic", "EMS Kara")
call obj.open ("EMS Kara", handle%)
call obj.put (handle%, 1, BildHeader$)
call xput (0,0,"EMS Kara")
call obj.close (handle%)
|
folgender Code:
call EMS.LOAD.FILE ("kara.pic", "EMS Kara")
müßte so aussehen:
call EMS.LOAD.FILE ("kara.pic", "Kara")
Hier mal ein Bilderstellungscode:
Code: |
const bpp% = 24
const xlen% = 640
const ylen% = 480
'Bildschirminhalt in Datei speichern
OPEN "bildneu.pic" FOR BINARY AS #1
'Header schreiben
header$=chr$(bpp%)+mki$(xlen%)+mki$(ylen%)
PUT #1,1,header$
'Bilddaten in Datei schreiben
FOR y%=0 to (ylen%-1)
call XGET (0,y%,(xlen%-1),y%,zeile$)
zeile$=MID$(zeile$,6)
PUT #1,,zeile$
NEXT y%
CLOSE #1
|
Code zum Anzeigen dieser Datei:
Code: |
picx%=0
picy%=0
OPEN "bildneu.pic" FOR BINARY AS #1
'Header auslesen
header$=SPACE$(5)
GET #1,1,header$
bpp%=asc(MID$(header$,1,1))
xlen%=cvi(MID$(header$,2,2))
ylen%=cvi(MID$(header$,4,2))
'Datenlänge berechnen
zeilenlen%=xlen%*(bpp%\8)
'Daten auf den Bildschirm bringen
FOR y%=0 TO (ylen%-1)
zeile$=SPACE$(zeilenlen%)
GET #1,,zeile$
zeile$=CHR$(bpp%)+MKI$(xlen%)+MKI$(1)+zeile$
call XPUT picx%,picy%+y%,zeile$
NEXT y%
CLOSE #1
|
Code ist ungetestet, sollte aber so funktionieren.
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
|
csde_rats
Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 26.01.2007, 18:38 Titel: |
|
|
Okay, DANKE.
Ich bin jetzt weg, also kann ich es erst in einer halben Stunde bis Stunde testen. nochmals Danke!
=========EDIT==============
Okay, kann es sein, dass XPUT oder/und XGET auf 256 Farben beschränkt sind? Ansonsten Funktioniert es super!! Edit: Nein falsche Bittiefe/Farbtiefe DANKE!!!
Ich werde das gleich mal als MAK-Modul in mein Game einbauen...
(Dieses kleine Problem werde ich alleine lösen Lösung: siehe unten)
Hier der Quelltext einer kleinen Demo (ein paar sachen noch korrigiert z.B: () hinter XPUT etc.)
Code: |
DECLARE SUB MakeFile (Filename AS STRING, Killold AS INTEGER)
DECLARE SUB ShowPic (Filename AS STRING)
DECLARE SUB MakePic (Filename AS STRING)
ON ERROR GOTO shit
CALL xscreen(&H111)
CALL set.picture(0, 0, "images\kara.bmp")
MakeFile "images\kara.bin", 1
MakePic "images\kara.bin"
CALL xcls(0)
DO: LOOP UNTIL INKEY$ <> ""
ShowPic "images\kara.bin"
DO: LOOP UNTIL INKEY$ <> ""
END
shit:
RESUME NEXT
SUB MakeFile (Filename AS STRING, Killold AS INTEGER)
NewFileNumber% = FREEFILE
IF Killold <> 0 THEN
KILL Filename
OPEN Filename$ FOR OUTPUT AS NewFileNumber%
CLOSE NewFileNumber%
ELSEIF Killold = 0 THEN
OPEN Filename$ FOR OUTPUT AS NewFileNumber%
CLOSE NewFileNumber%
END IF
END SUB
SUB MakePic (Filename AS STRING)
'Werte
CONST bpp% = 16 'Hier stand vorher CONST bpp% = 24 diese farbtiefe kann gar nicht korrekt angezeigt werden (Ausgangsbild war mit 16-Bit Palette und 24-Bit Header)
CONST xlen% = 640
CONST ylen% = 480
'Bildschirminhalt in Datei speichern
OPEN Filename$ FOR BINARY AS #1
'Header schreiben
header$ = CHR$(bpp%) + MKI$(xlen%) + MKI$(ylen%)
PUT #1, 1, header$
'Bilddaten in Datei schreiben
FOR y% = 0 TO (ylen% - 1)
CALL XGET(0, y%, (xlen% - 1), y%, zeile$)
zeile$ = MID$(zeile$, 6)
PUT #1, , zeile$
NEXT y%
CLOSE #1
END SUB
SUB ShowPic (Filename AS STRING)
picx% = 0
picy% = 0
OPEN Filename$ FOR BINARY AS #1
'Header auslesen
header$ = SPACE$(5)
GET #1, 1, header$
bpp% = ASC(MID$(header$, 1, 1))
xlen% = CVI(MID$(header$, 2, 2))
ylen% = CVI(MID$(header$, 4, 2))
'Datenlänge berechnen
zeilenlen% = xlen% * (bpp% \ 8)
'Daten auf den Bildschirm bringen
FOR y% = 0 TO (ylen% - 1)
zeile$ = SPACE$(zeilenlen%)
GET #1, , zeile$
zeile$ = CHR$(bpp%) + MKI$(xlen%) + MKI$(1) + zeile$
CALL XPUT(picx%, picy% + y%, zeile$)
NEXT y%
CLOSE #1
END SUB
|
Okay, ich habe eben den Fehler gefunden und beseitigt. Der Fehler war eine falsche Bittiefe in der Sub MakePic. (16 anstatt 24-Bit ) _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|