Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

PUT Bilder mit AK-Lib

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Spezielle Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 25.01.2007, 18:07    Titel: PUT Bilder mit AK-Lib Antworten mit Zitat

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, 18:20, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
A.K.



Anmeldungsdatum: 02.05.2005
Beiträge: 467
Wohnort: HH

BeitragVerfasst am: 25.01.2007, 22:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen Yahoo Messenger MSN Messenger
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 26.01.2007, 14:57    Titel: Antworten mit Zitat

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 zwinkern )

PPS: Ich habe nichts gegen eine Lösung mit externen Paletten Zunge rausstrecken
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick


Zuletzt bearbeitet von csde_rats am 14.07.2007, 18:20, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 26.01.2007, 15:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 26.01.2007, 15:29    Titel: Antworten mit Zitat

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 mit dem Kopf durch die Mauer wollen gelaufen?
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick


Zuletzt bearbeitet von csde_rats am 14.07.2007, 18:20, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 26.01.2007, 15:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 26.01.2007, 15:39    Titel: Antworten mit Zitat

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, 18:19, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 26.01.2007, 15:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 26.01.2007, 16:03    Titel: Antworten mit Zitat

Ich will eben KEIN BMP erstellen sondern NUR REINE Bilddaten!! Und mit 16/24 Bit MUSS ja nicht sein. Zunge rausstrecken
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, 18:19, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 26.01.2007, 16:41    Titel: Antworten mit Zitat

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? zwinkern
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
A.K.



Anmeldungsdatum: 02.05.2005
Beiträge: 467
Wohnort: HH

BeitragVerfasst am: 26.01.2007, 16:52    Titel: Antworten mit Zitat

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, 16:53, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen Yahoo Messenger MSN Messenger
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 26.01.2007, 16:53    Titel: Antworten mit Zitat

@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, 18:19, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
A.K.



Anmeldungsdatum: 02.05.2005
Beiträge: 467
Wohnort: HH

BeitragVerfasst am: 26.01.2007, 17:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen Yahoo Messenger MSN Messenger
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 26.01.2007, 17:38    Titel: Antworten mit Zitat

Okay, DANKE.
Ich bin jetzt weg, also kann ich es erst in einer halben Stunde bis Stunde testen. nochmals Danke! vor Freude klatschen

=========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!!!
Yahooo!!!! Yahooo!!!!
Yahooo!!!! Yahooo!!!!
vor Freude klatschen
vor Freude klatschen
Ich werde das gleich mal als MAK-Modul in mein Game einbauen...
(Dieses kleine Problem werde ich alleine lösen happy 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 mit den Augen rollen)
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Spezielle Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz