Página 1 de 1

Armazenar imagens em um .DBF.

Enviado: 24 Jan 2007 22:33
por rochinha
Amiguinhos

Tive esta idéa a trocentos anos atraz e nunca coloquei em pratica mesmo porque na epoca não existiam os padrões .JPG e GIF somente os padrões PCX, TIFF e BMP, inimagináveis de se trabalhar pelo tamanho que ocupavam.

Hoje o que vemos é que as imagens podem ter definição extrema com tamanho super reduzido.

E o nosso sonho sempre foi este poder armazenar as fotos do funcionários junto com seus dados no .DBF.

Se tem alguma biblioteca que faz isto acho que tenha, mas em puro Clipper sei que não.

Bom sem muito falatório vejam este código e façam os testes e reparos:

Código: Selecionar todos

function IMG2MEMO( arquivo )
   bak_pont=0
   destino := L2Hex(GetTickCount())+".TMP"
   arqcria := fcreate(destino)
   arqler  := fopen( origem )
   fimarq := fseek( arqler, 0, 2 )
   for ponteiro = 0 to fimarq step 5000
        bak := space( 5000 )
        if ponteiro + 5000 > fimarq
           bak := space( fimarq - ponteiro )
        endif
        fseek( arqler, ponteiro )
        fread( arqler, @bak, len( bak ) )
        bak_pont += len( bak )
        fwrite( arqcria, bak )
   next
   fclose( arqler )
   fclose(arqcria)
   return memoread( destino )
Uso:

cImagem := IMG2MEMO( "foto.jpg" )
...
replace CAMPOMEMO with cImagem
...

Qual é o esquema? voce passa o nome da imagem que deve ter no maximo 64k( um .JPG com este tamanho possui uma definição muito boa ) que é o tamanho maximo de um campo MEMO( ja entenderam, né ).

A função fará a leitura bia-a-bit, ou byte-a-byte da imagem e a gravará em outro arquivo( na verdade basta renomear um .JPG para .TXT da na mesma ) e fará o carregamento deste para a memória o resultado pode ser salvo em uma variável e então salva em um campo memo.

Legal né, agora fica por conta de voce fazerem o inverso, pegar o conteudo do campo memo e re-transformá-lo em um .JPG, hehehe!

Acho que funciona e voces?

Re: Armazenar imagens em um .DBF.

Enviado: 25 Jan 2007 10:06
por Maligno
Seu código não vai funcionar corretamente do jeito que está. A variável origem não é definida. Me parece que aí você quis dizer arquivo, que é o argumento da função. Fora isso, a variável bak_point não tem utilidade nenhuma. Faltou alguma coisa?
Mas a questão maior é: porque fazer esse tipo de cópia byte-a-byte, se seria muito mais prático simplesmente renomear o arquivo? Ou mesmo usar uma função de cópia da CATools ou alguma outra biblioteca?
Nunca usei memo antes, por isso, não tenho certeza. Mas não haveria problema armazenar códigos binários (não imprimíveis) num campo memo? Não seria mais seguro converter para UUEncode ou Base64 (protocolos de eMail)?

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 25 Jan 2007 11:20
por rochinha
Amiguinho

Realmente deu uma fora na abertura da função.

Não sei de onde tirei aquele arquivo mas é isto mesmo.

E como disse anteriormente não sei qual biblioteca teria uma função com esta caracteristica.

e realemente o fato de renomear seria mais pratico, pois este codigo eu retirei da função de backup do MIRO que lias os arquivo e criava um só arquivo com tudo dentro.

Eu nunca cheguei a fazer um teste real, somente um unico teste e pronto. Mas a intenção foi a de plantar uma idéia não só de armazenar imagens como também pequeno arquivo .DOC etc.

Este método de transformar tipos não é inédito e é muito usado por alguns jackers para plantar um .EXE em nossas maquinas. Vi isto em um codigo em que sua função principal continha uma string con conteudo incompreensivel e em dado momento ele usava os métodos FSO para gravar este resultado no disco e renomeá-lo.

Não gosto muito de campos MEMO e agora que estou mexendo com o MySQL me deparei com um problema com os campos BLOB( que na teoria seria o mesmo que MEMO ) os quais não consegui salvar informações e/ou recuperar, até descobrir que o MySQL tem um tipo de campo TEXTo que comporta o mesmo ou até mais que 64k.

E enquanto levantava este conhecimento pude perceber que as função de gravação para este campo tanto usando o ADO( que uso ) como em PHP, fazem uso deste tipo de recurso.

Mas vou continuar pesquisando e levar em extrema consideração o que voce postou por ser de grande valia.

Valeu.

Enviado: 25 Jan 2007 17:57
por Stanis Luksys
Olá,

Eu ja tentei uma vez fazer este esquema de gravar como se fosse texto em campo memo e não deu certo. Mas não insisti, deve haver alguma maneira.

Deixando de lado os detalhes técnicos, acredito que não seja conveniente aramazenar imagens em DBFs. Me lembro quando eu trabalhava com Oracle que isso era possível, no entanto estava sendo feito um grande esforço para retirar essa funcionalidade do sistema. Por menor que seja uma figura (de uns 40 kb digamos), uma tabela com mil clientes já começa a pesar desnecessariamente, sendo que 100 Kb é o tamanho de uma tabela já bem grandinha no Oracle, Mysql e afins.

Dada esta situação, imagine em DBF...

Eu já necessitei disso, e resolvi colocar um campo pro cara dizer onde estava a figura, aí vai um campinho char com o conteúdo "C:\Meus Documentos\figura.jpg". Outa forma que encontrei é apenas mandar o cara salvar a figura em determinada pasta com o nome de "Cliente00001.jpg", enfim, existem soluções menos suicidas eu acho.

Penso que não devemos "forçar a barra" tentando fazer milagres com tecnologias antigas, pois como você mesmo mencionou, nem sequer existiam os formatos atuais de imagem na época de ouro dos DBFs.

Que é legal é, mas acho que mesmo dando certo, eu não faria.

É só uma opinião...

Re: Armazenar imagens em um .DBF.

Enviado: 05 Fev 2009 14:45
por Alexandre Silva
Oi..

Preciso apenas mostar uma imagem na tela de acordo com o codigo do produto
Nem precisaria armazerar em DBF, poderia estar numa pasta e eu 'carregaria e mostraria na tela' se o cliente apertasse uma tecla por exemplo
isso no clipper..
Alguma biblioteca ? ou program externo leve ??

Obrigado..
:xau

Re: Armazenar imagens em um .DBF.

Enviado: 05 Fev 2009 16:26
por gvc
Em clipper puro não dá.
Eu fiz usando a CLBC.
Vc guarda a imagem em uma pasta e no dbf vc tem o nome do arquivo.

Re: Armazenar imagens em um .DBF.

Enviado: 07 Fev 2009 01:24
por Adalberto
“Em barco de outros”.

He possível mostrar na tela uma imagem pequena, dentro da tela em modo consola?, a FastGt.Lib pode mais não trabalha em modo protegido. Senhores podem me ajudar?

Muito obrigado a todos.

Um grande abraço

Armazenar imagens em um .DBF.

Enviado: 18 Fev 2009 09:48
por Pablo César
Adalberto escreveu:É possível mostrar na tela uma imagem pequena, dentro da tela em modo console ?
Na minha opinião, quanto refere-se a exibição de imagens (fotos por exemplo), nunca é em modo console e sim em modo gráfico.
Adalberto escreveu:a FastGt.Lib pode, mas não trabalha em modo protegido. Senhores podem me ajudar ?
Adalberto, eu acho que devemos esquecer de trabalhar em Clipper para exibir fotos, pois todo aplicativo em Clipper que não esteja em modo gráfico, fica impossível de ser exibido com a mesma nitidez que teria em modo gráfico. Eu por exemplo faço para exibir uma foto através de outro aplicativo que de dentro da minha aplicação em modo console é chamado em outra sessão. Claro que esse aplicativo é GUI.

Re: Armazenar imagens em um .DBF.

Enviado: 18 Fev 2009 10:40
por vailton
Já vi isto na CLBC com Clipper puro... exibia uma foto em PCX do usuario logado. Mas não sei como o programador fez para exibir isto. Ha alguns anos atrás eu esbocei umas rotinas para a falecida BRGUI que guardava imagens em campos memo. O unico problema ao fazer isto é o CHR(26) que na epoca eu tratei assim:

Código: Selecionar todos

*
* O Pulo-do-gato para armazenar imagens
* em arquivos DBF utilizando campos DBT
*
*     by Vailton Renato - 30/07/2004 = 22:32hs
*
function MaskBinData(x)
      x := StrTran(x,chr(26),'\\#26//')
      x := StrTran(x,chr(00),'\\#00//')
   return x

function UnMaskBinData(x)
      x := StrTran(x,'\\#26//',chr(26))
      x := StrTran(x,'\\#00//',chr(00))
   return x
Só que hj eu acho q o codigo nao é o melhor de todos, mas funciona para o problema de guardar aquivos no DBF, para usar (se for usar) faça assim:

Código: Selecionar todos

** Para armazenar:
replace FOTO with MaskBinData( Memoread( "arquivo.bmp" ))

** Para rescatar o valor:
MemoWrit( "temp.bmp", UnMaskBinData( FOTO ) )
Espero que possa ajudar.