Bild neu schreiben?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

maxinet

Betreff: Bild neu schreiben?

BeitragMo, Mai 22, 2006 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Liebe Forengemeinde!
Habe ein problem:

Code: [AUSKLAPPEN]

file=OpenFile("img.bmp")
f2=WriteFile("img2.bmp")

Repeat
  sav$=ReadLine$(file)
  WriteLine f2, sav$
Until Eof(file)

sav$=ReadLine$(file)
WriteLine f2, sav$

CloseFile file
CloseFile f2


Das Bild wird nur mit streifen dargestellt.
Woran liegt das, was mache ich falsch?

Gruß, maxinet

Willi die Rübe

BeitragMo, Mai 22, 2006 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Nimm ReadByte/WriteByte, und warum schreibst du nach der Loop nochmal ne Zeile, die es eignetlich gar nicht gibt?
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage

TheProgrammer

BeitragMo, Mai 22, 2006 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
..oder benutze einfach CopyFile() ^^
aktuelles Projekt: The last day of human being
 

maxinet

BeitragMo, Mai 22, 2006 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, soll dann aber übers netzwerk gesendet werden.

Gruß
maxinet
 

maxinet

BeitragMo, Mai 22, 2006 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
So, jetzt soll das Bild über das Netzwerk übermittelt werden.
Ich habe das folgendermaßen probiert:


Server:
Code: [AUSKLAPPEN]
tcp=CreateTCPServer(2302)
if tcp=0 then notify "fehler" : end
datei=WriteFile("C:\temp\bild.bmp")
Repeat
  con=AcceptTCPStream(tcp)
  If con Then
    wdat$=ReadLine$(con)
    If wdat$="end" Then End
    WriteLine datei, wdat$
  EndIf
Forever



Client:
Code: [AUSKLAPPEN]
datei=OpenFile("C:\temp\img.bmp")
tcp=OpenTCPStream("localhost",2302)
if tcp=0 then notify "fehler" : end
Repeat
  WriteLine tcp,ReadLine(datei)
Until Eof(datei)

WriteLine tcp,"end"



Das Bild wird aber nicht übertragen. Er legt zwar eine Datei an, die aber immer 0Byte groß ist. Das ursprungsbild beträgt 900KB.

Gruß maxinet

Jolinah

BeitragMo, Mai 22, 2006 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest wie gesagt besser WriteByte und ReadByte benutzen. Readline wartet so lange bis ein Zeilenumbruch empfangen wurde und gibt dann den Text zurück. Ein Bild hat aber keine Zeilenumbrüche (naja wenn man so will schon, falls das ASCII-Zeichen 10 oder 13 vorkommt, aber man kann sich nicht darauf verlassen).

Da mit Writebyte aber jedes Byte einzeln als Paket gesendet wird, wäre es noch besser WriteBytes im Zusammenhang mit einer Bank zu benutzen.
 

maxinet

BeitragDi, Mai 23, 2006 6:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt schreibt der solange, bis ich den debugger beende. Das Bild ist dann ca. 360MB groß. Das original aber nur 900KB??

Gruß Maxinet

TheProgrammer

BeitragDi, Mai 23, 2006 8:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe dir mal die Lösung mit dem Versenden von größeren Datenpaketen mit Hilfe von Banken gecodet: (musst natürlich noch umschreiben, um es im Netzwerk anzuwenden)

Code: [AUSKLAPPEN]

Function CopyFileBytes(file_in$,file_out$,length%=100)

   bank = CreateBank(length%)
   fileIn = ReadFile(file_in$)
   fileOut = WriteFile(file_out$)
   
   If fileIn And fileOut Then
    Repeat
     l=length-1
     For I = 0 To length-1
      PokeByte(bank,I,ReadByte(fileIn))
      If Eof(fileIn) Then l=I : Exit
     Next
   
     For I = 0 To l
      WriteByte(fileOut,PeekByte(bank,I))
     Next
     FreeBank bank
     bank = CreateBank(length%)
    Until Eof(fileIn)
   
    CloseFile fileIn
    CloseFile fileOut
    FreeBank bank
   EndIf

End Function


Mit dem dritten Parameter gibst du an, wie viele Bytes mit einem Paket versendet werden sollen.

Mfg
TheProgrammer
aktuelles Projekt: The last day of human being
 

maxinet

BeitragDi, Mai 23, 2006 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
lol
irgendwie bin ich zu doof dafüt. Funktioniert nich...


Gruß maxinet

TheProgrammer

BeitragDi, Mai 23, 2006 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Bist du sicher, dass die Dateien existieren, die du angibst? Lass mal

Code: [AUSKLAPPEN]

If fileIn And fileOut Then
 ...
EndIf


weg und schau mal, ob du einen Fehler erhälst. Bei mir funktioniert die Funktion perfekt.

Mfg
TheProgrammer
aktuelles Projekt: The last day of human being
 

maxinet

BeitragDi, Mai 23, 2006 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie groß darf length% maximal sein?

Maxinet

TheProgrammer

BeitragDi, Mai 23, 2006 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist eigentlich egal. Wenn length% größer ist, als das Bild selbst groß ist, wird das ganze Bild in einem Datenpaket versendet.
aktuelles Projekt: The last day of human being
 

maxinet

BeitragMi, Mai 24, 2006 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktionieren tut es ja, aber es ist ein sehr langsames verfahren. Das Screenshot ist ca. 2 einhalb MB groß, was über das netzwerk übertragen wird. Hierfür werden ca. 6-7 minuten benötigt.
Meiner meinung nach viel zu viel, da das netzwerk eine last von 50MB/s übertragen kann.

Gruß maxinet

Goodjee

BeitragMi, Mai 24, 2006 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
verschicke erst die größe und breite....und dann mach readpixelfast...sende den rückgabewert und schreib das ganze dann auf der anderen seite mit writepixelfast..
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

maxinet

BeitragSo, Mai 28, 2006 20:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Wo genau muss ich das ändern?

maxinet
 

maxinet

BeitragMi, Mai 31, 2006 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Server:
Code: [AUSKLAPPEN]
Global length%=100
Global file_out$="C:\temp\img.bmp"

tcp=CreateTCPServer(8002)
Repeat
  fileIn=AcceptTCPStream(tcp)
  If fileIn Then
    bank = CreateBank(length%)
    fileOut = WriteFile(file_out$)
   
    If fileIn And fileOut Then
      Repeat
        l=length-1
        WaitEvent(1)
        For I = 0 To length-1
         out$=ReadByte(fileIn)
         If out$="end" Then Exit
         PokeByte(bank,I,out$)
        Next
   
        For I = 0 To l
          WriteByte(fileOut,PeekByte(bank,I))
        Next
        FreeBank bank
        bank = CreateBank(length%)
      Until Eof(fileIn)
      CloseFile fileOut
      FreeBank bank
      Exit
    EndIf
  EndIf
Forever
CloseTCPServer tcp



Client:
Code: [AUSKLAPPEN]
datei_screen=OpenFile("C:\temp\screen.bmp")
tcp_screen=OpenTCPStream("192.168.178.22",8002);ReadString$(daten),8002)
If tcp_screen=0 Then MessageBox("","Der Server antwortet nicht!","Error",$40010) : End

Repeat
  inhalt_screen$=ReadByte(datei_screen)
  WriteByte tcp_screen,inhalt_screen$
Until Eof(datei_screen)
WriteLine tcp_screen,"end"
CloseTCPStream tcp_screen
CloseFile datei_screen



Ist viel zu langsam. Die funktion, die oben gepostet wurde ist total schnell. Aber bei mir wird dann übers netzwerk nur 20kb/s. übertragen -> zu langsam. Was mache ich falsch?

Maxi

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group