Jump to content
Fórum Script Brasil
  • 0

Lendo Arquivo Por Byte A Byte Com Python


Question

Fala galera tudo certo?

Bem é o seguinte já faz uns 2 meses que estou aprendendo o python e ainda estou no modo TEXTO e não grafico.. então eu resovil então criar um sistema de edição de personagem para uma engine chamada MUGEN que eu achei uma otima ideia para poder aprender o Python. e está sendo já aprendi muita coisa mais ainda estou no modo texto pois se você num sabe o modo texto não adianta ira para o ambiente grafico certo ? hahaha

Bem eu programo em php já faz uns 5 anos e de PHP eu entendo e comecei então a partir para o Python uma linguagem mais robusta e prometedora.. e que gostei muito de sua sintaxe que não deixa de ser muito parecido com o PHP por se basea no C

Bem vamos ao que intereça eu já sei abrir arquivos e ler também .. o problema está agora em menipular esse conteudo.. essa ferramenta que eu estou criando para editar personagens do MUGEN exite um arquivo chamado fulano.sff que é o Sprite de img do personagem bem até ai tudo ok.

Ai que começa a increnca.. o conteúdo dentro do sff é conteúdos bytes. que pelo criador da engine estipulo uma strutura de como gravar e ler esse arquivo eu tenho a strutura aqui

/*--| SFF file structure
|--------------------------------------------------*\
  Version 1.01
HEADER (512 bytes)
------
Bytes
00-11  "ElecbyteSpr\" signature                [12]
12-15  1 verhi, 1 verlo, 1 verlo2, 1 verlo3            [04]
16-19  Number of groups                        [04]
20-24  Number of images                        [04]
24-27  File offset where first subfile is located        [04]
28-31  Size of subheader in bytes                [04]
32     Palette type (1=SPRPALTYPE_SHARED or 0=SPRPALTYPE_INDIV)    [01]
33-35  Blank; set to zero                    [03]
36-511 Blank; can be used for comments                [476]

SUBFILEHEADER (32 bytes)
-------
Bytes
00-03 File offset where next subfile in the "linked list" is    [04] 
      located.  Null if last subfile

04-07 Subfile length (not including header)            [04]
      Length is 0 if it is a linked sprite
08-09 Image axis X coordinate                    [02]
10-11 Image axis Y coordinate                    [02]
12-13 Group number                        [02]
14-15 Image number (in the group)                [02]
16-17 Index of previous copy of sprite (linked sprites only)    [02]
      This is the actual
18    True if palette is same as previous image            [01]
19-31 Blank; can be used for comments                [14]
32-   PCX graphic data. If palette data is available, it is the last
      768 bytes.
\*--------------------------------------------------------------------------*/
Bem agora essa strutura aí pelo que eu entendi eu irei ler ele byte a byte então iria fazer algo como
SFFFile = open("fulano.sff","r");

#criando variaveis HEADER
Header = {} # 512 bytes
Header["signature"] = SFFFile.read(12);
Header["version"] = [SFFFile.read(1),SFFFile.read(1),SFFFile.read(1),SFFFile.read(1)]; # [4]
Header["NoGroups"] = SFFFile.read(4);
Header["NoImages"] = SFFFile.read(4);
Header["FirstFileOffset"] = SFFFile.read(4);
Header["SizeSubHeader"] = SFFFile.read(4);
Header["PaletteType"] = SFFFile.read(1);
Header["BlankSetZero"] = SFFFile.read(3);
Header["Comments"] = SFFFile.read(476);

Mais ai num sei se estou no caminho certo... num sei como recuperar os dados depois =/ quem poderia me dar uma luz? em anexo está o arquivo kfm.sff

strutura_sff.rar

Link to post
Share on other sites

10 answers to this question

Recommended Posts

  • 0

Feito.. está anexado a esse post..

Bem eu estou no caminho agora preciso de ajuda para poder continuar.... pois daqui para frente num tou conseguindo proceguir...

Quanto o subheader creio eu que tenho que dar um loop de 32 bites para recuperar tudo até o final do arquivo.. mais antes preciso entender =/

strutura_sff.zip

Link to post
Share on other sites
  • 0

Consegui ler o resto do arquivo usando funções que criei para ler tags de MP3. Só tive que inverter os bytes porque a ordem dos bits é diferente da que eu usava (mas isso foi resolvido com a função reversed()). O código ficou assim:

# -*- coding: iso-8859-1 -*-

from utils import *

SFFFile = open("kfm.sff","r")

Header = {} # 512 bytes
Header["signature"] = SFFFile.read(12)
Header["version"] = [SFFFile.read(1), SFFFile.read(1), SFFFile.read(1), SFFFile.read(1)] # [4]
Header["NoGroups"] = SFFFile.read(4)
Header["NoImages"] = SFFFile.read(4)
Header["FirstFileOffset"] = SFFFile.read(4)
Header["SizeSubHeader"] = SFFFile.read(4)
Header["PaletteType"] = SFFFile.read(1)
Header["BlankSetZero"] = SFFFile.read(3)
Header["Comments"] = SFFFile.read(476)

qtimagens = calcsize(Header["NoImages"])
proximo = calcsize(Header["FirstFileOffset"])

i=0
while i<qtimagens-1:
    SFFFile.seek(proximo)
    
    SubHeader = {}
    SubHeader["Next"] = SFFFile.read(4)
    SubHeader["SubFileLength"] = SFFFile.read(4)
    SubHeader["X"] = SFFFile.read(2)
    SubHeader["Y"] = SFFFile.read(2)
    SubHeader["Group"] = SFFFile.read(2)
    SubHeader["ImageNumber"] = SFFFile.read(2)
    SubHeader["Previous"] = SFFFile.read(2)
    SubHeader["Palette"] = SFFFile.read(1)
    SubHeader["Comments"] = SFFFile.read(14)

    tamanho = calcsize(SubHeader["SubFileLength"])

    SubHeader["PCXData"] = SFFFile.read(tamanho)

    print "Posição da próxima imagem: %i" % calcsize(SubHeader["Next"])
    print "Tamanho..................: %i" % tamanho
    print "Posição X................: %i" % calcsize(SubHeader["X"])
    print "Posição Y................: %i" % calcsize(SubHeader["X"])
    print "Grupo....................: %i" % calcsize(SubHeader["Group"])
    print "Número da imagem.........: %i" % calcsize(SubHeader["ImageNumber"])
    print "Número da imagem anterior: %i" % calcsize(SubHeader["Previous"])
    print "Paleta...................: %i" % calcsize(SubHeader["Palette"])
    print "Comentários..............: %s" % SubHeader["Comments"]

    proximo = calcsize(SubHeader["Next"])

    print proximo
    i += 1
    #if i==10: break
Crie um arquvo chamado utils.py com as seguintes funções:
def b2d(l):
    lista = l[:]
    lista.reverse()
    qt = 0
    ret = 0
    for b in lista:
        if b==1:
            ret += 2**qt
        qt += 1
    return ret

def d2b(n):
    ret = []
    while n!=1 and n!=0:
        resto = n%2
        n = n/2
        ret.append(resto)
    ret.append(n)
    pad = [0]*(8-len(ret))
    ret += pad
    ret.reverse()
    return ret

def calcsize(chunk):
    bytes = [d2b(b) for b in [ord(x) for x in reversed(chunk)]]
    bits = []
    for byte in bytes:
        bits += byte
    return b2d(bits)

Tentei gravar o conteúdo de um PCXData para um arquivo .pcx, mas não tive sucesso em visualizá-lo. Talvez falte a paleta ou algo assim. Não sei a estrutura de um PCX, então não deu para testar.

Abraços,

Graymalkin

Link to post
Share on other sites
  • 0

Opa... gostei em.. tu é o cara mesmo =DDDD

cara só me fala uma coisa.. como funciona esse seu utils aí.. o que ele faz? pois está sem comentarios.. então num entendi legal o que ele faz.... =/

Quanto ao gerar a img pcx acho que com a biblioteca PIL tem como você passar os valores.. mais ainda não sei trabalhar com a bliblioteca... =/ se você souber.. me ajuda aí também hahah =D

Vlw

cara consegui entender o seu utils.py. eu iria resolver com apenas essa função..

def calcsize(chunk):
    old = 0;
    for x in reversed(chunk):
        old = (old << 8) | ord(x);
    return old;

Ela já faz tudo aquilo que você fez... mais gostei do que você fez pois foi uma forma de se chegar ao resultado seguindo passo a passo.

Agora preciso só saber como recuperar a img e tals.. alguém sabe usar a biblioteca PIL aí para me dar um toque?

Link to post
Share on other sites
  • 0
cara consegui entender o seu utils.py. eu iria resolver com apenas essa função..

def calcsize(chunk):
    old = 0;
    for x in reversed(chunk):
        old = (old << 8) | ord(x);
    return old;

Ela já faz tudo aquilo que você fez... mais gostei do que você fez pois foi uma forma de se chegar ao resultado seguindo passo a passo.

É que no meu caso eu precisava efetivamente ver os bits, então montei tudo passo-a-passo. Mas, gostei da sua função também.

Quanto ao gerar a img pcx acho que com a biblioteca PIL tem como você passar os valores.. mais ainda não sei trabalhar com a bliblioteca... =/ se você souber.. me ajuda aí também hahah =D

Agora preciso só saber como recuperar a img e tals.. alguém sabe usar a biblioteca PIL aí para me dar um toque?

Eu já usei a PIL, mas não pra esse tipo de coisa (foi só para redimensionar imagens e inserir uma marca d'água). Mas, vou ver se consigo algo.

Abraços,

Graymalkin

PS: Ei, estamos usando Python, então não precisamos do famigerado ponto-e-vírgula... :D

Link to post
Share on other sites
  • 0

Eu gosto do ";" pois fica mais visivel para o pessoal que está aprendendo a programa onde termina uma linha de script e tals... pois eu vou ver de deixar esse script que estou montando opensource.. então eu estou comentando todo ele.. =D

Link to post
Share on other sites
  • 0

Eu fiz um teste aqui e tentei abrir o pcx com o PIL e consegui abrir um arquivo normal do PCX com o comando:

from PIL import Image

im = Image.open("imgem.pcx");
im.show();
E ele me mostro a img na tela.. agora preciso saber como gerar a img com o PIL somente com os dados bytes.. e até agora sem sucesso =/ Eu tentei algo como
from PIL import Image
imString = open("imagem.pcx","r").read();

im = Image.fromstring("1",(20,20),imString);
im.show();
Mais sem exito =/ olha a sintaxe.:
Image.fromstring(mode, size, data) => image Creates an image memory from pixel data in a string, using the standard "raw" decoder. Image.fromstring(mode, size, data, decoder, parameters) => image Same, but allows you to use any pixel decoder supported by PIL. For more information on available decoders, see the section Writing Your Own File Decoder. Note that this function decodes pixel data, not entire images. If you have an entire image file in a string, wrap it in a StringIO object, and use open to load it.
Opa acho que sei porque está dando erro na hora que você tenta ler o pcx... anexo tem 1 img o primeiro elemento que você carrega.. esse pcx está funfionando ele é a primeira imagem do grupo 9000 Veja o codigo fonte dele e veja o codigo fonte que está retornando o PCXData mais claro crie um salvar aí..
im = open("imagen.pcx","w");
im.write(SubHeader["PCXData"]);
im.close();
depois abre esse arquivo que você acaba de criar e o que está em anexo aqui e veja que há uma diferença pouca no começo pelo - no do anexo tem 4 quadrados e no salvo tem somente 3 .. o que será que estamos fazendo de errado? caso queria eu fiz uma classe para manipular esse sff.. pois depois vou ter que criar um solvar sff =D loadSFF.class.py
# -*- coding: iso-8859-1 -*-

# Essa biblioteca é onde vou tentar criar o manipulador de IMG PCX
from PIL import Image

# Biblioteca referente a funções e classes para auxiliar a mesma
from utils import *

# <<  Inicio class SFF

class SFF(struct):
    """
    #Nome: SFF    
    #Desc: Le arquivo de strutura SFF
    #Author: Erick Leão (Perfect Lion) - [email protected] - MSN: [email protected]
    #Site: www.paodemugen.com.br
    """
    
    Header = struct();
    SubHeader = []; msgError = [];
    SFFFile = str;
    TotalLoad = "false";

    def __init__(self,arquivo,modo="r"):
        """
        #Name: INI
        #Desc: Metodo construtor
        """
        try:
            self.SFFFile = open(arquivo,modo);
        except:
            self.msgError.append("FILE -> Não foi possivel abrir o arquivo");

    def header(self):
        """
        #Name: header
        #Desc: Responsavel por ler e recuperar o Header do arquivo
        #Param: void
        #Return: void
        """
        self.Header.signature = self.SFFFile.read(12); # str
        if self.Header.signature[0:11] == "ElecbyteSpr":
            self.Header.version = [
                                calcsize(self.SFFFile.read(1)) # int
                                , calcsize(self.SFFFile.read(1)) # int
                                , calcsize(self.SFFFile.read(1)) # int
                                , calcsize(self.SFFFile.read(1)) # int
                                ]
            self.Header.NoGroups = calcsize(self.SFFFile.read(4)); # int
            self.Header.NoImages = calcsize(self.SFFFile.read(4)); # int
            self.Header.FirstFileOffset = calcsize(self.SFFFile.read(4)); # int
            self.Header.SizeSubHeader = calcsize(self.SFFFile.read(4)); # int
            self.Header.PaletteType = calcsize(self.SFFFile.read(1)); # int
            self.Header.BlankSetZero = calcsize(self.SFFFile.read(3)); # int or str?
            self.Header.Comments = self.SFFFile.read(476); # str
        else:
            self.msgError.append("Header -> O header não é um SFF verifique o arquivo;")
            return

    def subHeader(self):
        """
        #Name: subHeader
        #Desc: Responsavel por ler e recuperar o subHeader do arquivo
        #Param: void
        #Return: void
        """

        proximo = self.Header.FirstFileOffset;

        i=0
        while i < (self.Header.NoImages - 1):        
            self.SFFFile.seek(proximo); # move o ponteiro até o byte da img
            
            Next = calcsize(self.SFFFile.read(4));
            SubFileLength = calcsize(self.SFFFile.read(4));
            X = calcsize(self.SFFFile.read(2));
            Y = calcsize(self.SFFFile.read(2));
            Group = calcsize(self.SFFFile.read(2));
            ImgNumber = calcsize(self.SFFFile.read(2));
            Previous = calcsize(self.SFFFile.read(2));
            Palette = calcsize(self.SFFFile.read(1));
            Comments = self.SFFFile.read(14);            
            PCXData = self.SFFFile.read(SubFileLength);

            self.SubHeader.append(
                {
                    "Next" : Next #int
                    , "SubFileLength" : SubFileLength #int
                    , "X" : X # int
                    , "Y" : Y # int
                    , "Group" : Group # int
                    , "ImgNumber" : ImgNumber # int
                    , "Previous" : Previous # int
                    , "Palette" : Palette # int
                    , "Comments" : Comments # str 
                    , "PCXData" : PCXData # str
                }
            );

            proximo = Next; # vai para o proxima imagen (byte)
            
            if self.TotalLoad != "false" and (i + 1) == self.TotalLoad : break;

            i += 1;

    def read(self):
        """
        #Name: read
        #Desc: Lé o conteúdo do arquivo;
        #Param: void
        #Return: void
        """
        if self.SFFFile:
            self.header();
            self.subHeader();
        else:
            self.msgError.append("Read -> O aquivo não foi aberto;")
            return
    
    def debug(self,abilitado=0):
        """
        #Name: debug
        #Desc: Debuga o sistema caso não retorne nada.. abilitando a mesma informa onde
               O erro.
        """
        if abilitado:
            for msg in self.msgError:
                print msg;
            
# >> Fim class SFF

# Inicia a classe chamando o arquivo ele aceita mais 1 paramento
# esse outro paramento é o metodo que o arquivo será aberto
# o padrão é "r" que é abrir para leitura
# mais quando formos grv
SFFLoad = SFF("chars/kfm/kfm.sff");

# setá uma quantidade a ser mostrada... isso aqui serve só para a gente
# fazer os testes pois ter que ficar fazendo teste e sempre
# mostrando todos é ruim em =)
SFFLoad.TotalLoad = 1;

# Manda executar e ler o SFF
SFFLoad.read();

# Debug opcional quando em 1 mostra os erros que foram encontrado
SFFLoad.debug(1);

# SubHeader traz uma lista contendo bibliotecas com os nomes dos campos
# Aqui eu fiz com que ele me mostra uma lista do que tenho
# Printando na tela o valor deles;)
# EX:
for x in SFFLoad.SubHeader:
    print "Posição da próxima imagem: %i" % x["Next"]
    print "Tamanho..................: %i" % x["SubFileLength"]
    print "Posição X................: %i" % x["X"]
    print "Posição Y................: %i" % x["Y"]
    print "Grupo....................: %i" % x["Group"]
    print "Número da imagem.........: %i" % x["ImgNumber"]
    print "Número da imagem anterior: %i" % x["Previous"]
    print "Paleta...................: %i" % x["Palette"]
    print "Comentários..............: %s" % x["Comments"]
fileSFF = open("tmp.pcx","w");
fileSFF.write(SFFLoad.SubHeader[0]["PCXData"]);
fileSFF.close();
#fileSFF = Image.open("tmp.pcx");
#fileSFF.show();
utils.py
def calcsize(chunk):
    old = 0;
    for x in reversed(chunk):
        old = (old << 8) | ord(x);
    return old;

class struct:
    pass;

Edited by Perfect Lion
Link to post
Share on other sites
  • 0

É eu descobri que está errado na strutura.. o comentário do SubHeader não é 14 e sim 13 pois se você for fazer a conta

19-31 Blank; can be used for comments [14]

31 - 19 = 12

12 + "0" = 13 pois como sabemos ele começa contar o 0 como um lista ;)

então se colocar 13 ao invez de 14 no comentarios ele funciona... agora só preciso saber como eu vou fazer para recarregar essa img.. pois eu não posso salvar ela ela só tem que permanecer na memoria. pois só será salvo quando o cara solicitar salvar tal img. etals..

Então eu tenho que mostrar a img mais não salvar e depois carregala.. eu tenho que tentar fazer ele carregar direto da memoria.. alguém tem alguma ideia?

A eu num estou conseguindo recuperar a Paleta que são os ultimos 768 do arquivo.. pelo que está informando aí na strutura

A eu atualizei o loadSFF.class.py la vai:

loadSFF.class.py

# -*- coding: iso-8859-1 -*-

# Essa biblioteca é onde vou tentar criar o manipulador de IMG PCX
from PIL import Image

# Biblioteca referente a funções e classes para auxiliar a mesma
from utils import *

# <<  Inicio class SFF

class SFF(struct):
    """
    #Nome: SFF    
    #Desc: Le arquivo de strutura SFF
    #Author: Erick Leão (Perfect Lion) - [email protected] - MSN: [email protected]
    #Site: www.paodemugen.com.br
    """

    Header = struct();
    SubHeader = []; msgError = [];
    Paleta = False;
    SFFFile = str;
    TotalLoad = False;

    def __init__(self,arquivo,modo="r"):
        """
        #Name: INI
        #Desc: Metodo construtor
        """
        try:
            self.SFFFile = open(arquivo,modo);
        except:
            self.msgError.append("FILE -> Não foi possivel abrir o arquivo");

    def header(self):
        """
        #Name: header
        #Desc: Responsavel por ler e recuperar o Header do arquivo
        #Param: void
        #Return: void
        """
        self.Header.signature = self.SFFFile.read(12); # str # assinatura do SFF
        if self.Header.signature[0:11] == "ElecbyteSpr":
            self.Header.version = [
                    calcsize(self.SFFFile.read(1)) # int
                    , calcsize(self.SFFFile.read(1)) # int
                    , calcsize(self.SFFFile.read(1)) # int
                    , calcsize(self.SFFFile.read(1)) # int
                                  ]; # Version do sff
            self.Header.NoGroups = calcsize(self.SFFFile.read(4)); # int Numeros de grupos existentes
            self.Header.NoImages = calcsize(self.SFFFile.read(4)); # int Numero de imagens existenes
            self.Header.FirstFileOffset = calcsize(self.SFFFile.read(4)); # int recupera a primeira posiçao em bytes da primeira img
            self.Header.SizeSubHeader = calcsize(self.SFFFile.read(4)); # int tamanho do subHeader
            self.Header.PaletteType = calcsize(self.SFFFile.read(1)); # int Tipo de paleta
            self.Header.BlankSetZero = calcsize(self.SFFFile.read(3)); # int num sei ainda :P
            self.Header.Comments = self.SFFFile.read(476); # str comentarios
        else:
            self.msgError.append("Header -> O header não é um SFF verifique o arquivo;")
            return

    def subHeader(self):
        """
        #Name: subHeader
        #Desc: Responsavel por ler e recuperar o subHeader do arquivo
        #Param: void
        #Return: void
        """
        proximo = self.Header.FirstFileOffset;

        i=0
        while i < self.Header.NoImages: # 32 bytes
            self.SFFFile.seek(proximo); # move o ponteiro até o byte das info da img

            Next = calcsize(self.SFFFile.read(4)); # 4 bytes recupera o bytes onte se encontra a proxima imagem
            SubFileLength = calcsize(self.SFFFile.read(4)); # 4 bytes recupera o tamanho do pcx
            X = calcsize(self.SFFFile.read(2)); # 2 bytes recupera a posiçao X da img
            Y = calcsize(self.SFFFile.read(2)); # 2 bytes recupera a posiçao Y da img
            Group = calcsize(self.SFFFile.read(2)); # 2 bytes recupera o grupo a que ela pertence
            ImgNumber = calcsize(self.SFFFile.read(2)); # 2 bytes numero da img atual
            Previous = calcsize(self.SFFFile.read(2)); # 2 bytes numro da img anterior
            Palette = calcsize(self.SFFFile.read(1)); # 1 byte se ela utiliza Paletta
            Comments = self.SFFFile.read(13); # 13 bytes Comentarios referente a img

            PCXData = self.SFFFile.read(SubFileLength + (Next - SubFileLength - self.SFFFile.tell())); # recupera os bytes da img

            self.SubHeader.append(
                {
                    "Next" : Next #int
                    , "SubFileLength" : SubFileLength #int
                    , "X" : X # int
                    , "Y" : Y # int
                    , "Group" : Group # int
                    , "ImgNumber" : ImgNumber # int
                    , "Previous" : Previous # int
                    , "Palette" : Palette # int
                    , "Comments" : Comments # str 
                    , "PCXData" : PCXData # str
                }
            ); 

            proximo = Next; # vai para o proxima imagen (byte)

            if self.TotalLoad != "false" and (i + 1) == self.TotalLoad : break;

            i += 1;

    if self.TotalLoad == False and (i + 1) != self.TotalLoad :
        self.Paleta = calcsize(self.SFFFile.read(Next));

    def read(self):
        """
        #Name: read
        #Desc: Lé o conteúdo do arquivo;
        #Param: void
        #Return: void
        """
        if self.SFFFile:
            self.header();
            self.subHeader();
        else:
            self.msgError.append("Read -> O aquivo não foi aberto;")
            return

    def debug(self,abilitado=0):
        """
        #Name: debug
        #Desc: Debuga o sistema caso não retorne nada.. abilitando a mesma informa onde
               O erro.
        """
        if abilitado:
            for msg in self.msgError:
                print msg;

# >> Fim class SFF

# Inicia a classe chamando o arquivo ele aceita mais 1 paramento
# esse outro paramento é o metodo que o arquivo será aberto
# o padrão é "r" que é abrir para leitura
# mais quando formos grv
SFFLoad = SFF("chars/kfm/kfm.sff");

# setá uma quantidade a ser mostrada... isso aqui serve só para a gente
# fazer os testes pois ter que ficar fazendo teste e sempre
# mostrando todos é ruim em =)
#SFFLoad.TotalLoad = 5;

# Manda executar e ler o SFF
SFFLoad.read();

# Debug opcional quando em 1 mostra os erros que foram encontrado
#SFFLoad.debug(1);

# SubHeader traz uma lista contendo bibliotecas com os nomes dos campos
# Aqui eu fiz com que ele me mostra uma lista do que tenho
# Printando na tela o valor deles;)
# EX:
i = 0;
Mostrar = {}
Mostrar["inicio"] = 0;
Mostrar["fim"] = 0;
for x in SFFLoad.SubHeader:
    if i >= Mostrar["inicio"] and i <= Mostrar["fim"]:
        print "Posição da próxima imagem: %i" % x["Next"]
        print "Tamanho..................: %i" % x["SubFileLength"]
        print "Posição X................: %i" % x["X"]
        print "Posição Y................: %i" % x["Y"]
        print "Grupo....................: %i" % x["Group"]
        print "Número da imagem.........: %i" % x["ImgNumber"]
        print "Número da imagem anterior: %i" % x["Previous"]
        print "Paleta...................: %i" % x["Palette"]
        print "Comentários..............: %s" % x["Comments"]
    i += 1;
im = open("tmp.pcx","w");
im.write(SFFLoad.SubHeader[0]["PCXData"]);
im.close();

Edited by Perfect Lion
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Cloud Computing


  • Forum Statistics

    • Total Topics
      148691
    • Total Posts
      644531
×
×
  • Create New...