Page 1 of 1

loadFromString() -> Modifications!

Posted: Thu Apr 24, 2008 6:23 pm
by JC
Linares... your method loadFromString() was a perfect solution for my problems!

Exists a way to use this same method but now, to open a image different that .bmp? For example, a .jpg or .gif image?

Something using a CreateMemFile() ... ?? Or some else!!

Thanks!

Posted: Fri Apr 25, 2008 2:44 pm
by yury
olá,

vc pode usar desta forma também...

Code: Select all

#include "fivewin.ch"


Function Teste()


cFileBmp = cGetFile("*.bmp")
cFileJpg = cGetFile("*.jpg")
cFileGif = cGetFile("*.gif")


cEncBmp = 'c:\temp\memo_bmp.tmp' 
cEncJpg = 'c:\temp\memo_jpg.tmp' 
cEncGif = 'c:\temp\memo_gif.tmp' 


FMimeEnc(cFileBmp,cEncBmp)
FMimeEnc(cFileJpg,cEncJpg)
FMimeEnc(cFileGif,cEncGif)


cTmpFileBmp = 'c:\temp\bmplida.bmp'
cTmpFileJpg = 'c:\temp\jpglida.jpg'
cTmpFileGif = 'c:\temp\giflida.jpg'


FMimeDec(cEncBmp,cTmpFileBmp)
FMimeDec(cEncJpg,cTmpFileJpg)
FMimeDec(cEncGif,cTmpFileGif)


msginfo( 'OK !' )


return
um abraço

Posted: Fri Apr 25, 2008 2:47 pm
by JC
Yuri... valeu pela resposta... mas não compreendi muito bem oq tu quis dizer!

Na verdade a situação é a seguinte: Uma imagem é gravada no banco de dados, em um campo BLOB.
Com o método loadFromString() que Linares implementou, é possível carregar essa imagem diretamente do banco, sem a necessidade de criá-la em disco.

Mas isso funciona para arquivos bitmap. Gostaria do mesmo para quaisquer tipos de imagem, ou, pelo menos, para bitmap, jpeg e gif.

Posted: Fri Apr 25, 2008 5:46 pm
by yury
olá Julio,

desculpe, eu deveria ter sido mais claro...

eu gravo imagens em arquivo tipo Memo, que seriam os "equivalentes" aos BLOBs e faço desta forma, onde a imagem é criada no disco somente temporariamente, sendo deletada depois (não vi o método LoadFromString, mas tenho quase certeza que ele cria um arquivo temporário no disco para depois deletá-lo)

veja este exemplo:


Code: Select all

#include "fivewin.ch"

Function Teste()

local cFileDbf := 'c:\temp\Dados.DBF'
local aEstr    := {{"cNome","C",30,00},;
                   {"cExte","C",05,00},;
						 {"mImag","M",10,00} } 

if .not.file(cFileDbf)
   DBCREATE(cFileDbf,aEstr,'DBFNTX',.T.,'temp')
else
   DBUSEAREA(.T.,'DBFNTX',cFileDbf,'temp',.F.)
endif

if neterr()
   ? 'Erro ao abrir arquivo '+cFileDbf
	return
endif

SELECT temp

while .t.
   nOpc=ALERT('Selecione a opção:',{'Gravar Imagens','Ler Imagens gravadas'},'Opções:')

   if nOpc<1
      close all
      return
   endif

   if nOpc=1
	   oTela=nil
      oNome=nil
      lSalva=.F.

      memvar->cNome=SPACE(30)

      cPath=cGetFile("*.jpg",'Selecione a imagem desejada')

      if .not.file(cPath)
         close all
	      return
      endif

      define dialog oTela from 01,01 to 20,60 title 'Gravando imagem em Memo'

      @ 01,01 say 'Imagem:' OF oTela COLOR CLR_BLACK
      @ 01,06 say cPath OF oTela COLOR CLR_HBLUE

      @ 03,01 say 'Digite o nome para imagem:' of oTela COLOR CLR_BLACK
      @ 4.5,01 get oNome VAR memvar->cNome of oTela 
   
      @ 05,01 button 'Gravar' of oTela size 50,12 action (lSalva:=.t.,oTela:End()) CANCEL
	
	   activate dialog oTela centered
	   
	   if .not.lSalva
	      loop
		endif
	
      cTemp = 'c:\temp\temp001.tmp'
		
		FMimeEnc(cPath,cTemp)
      
      if file(cTemp)
		   cMemo=memoread(cTemp)
		   cMemo=STRTRAN(cMemo,CRLF,'')
			temp->(DBAPPEND())
			REPLACE temp->cNome with memvar->cNome
			REPLACE temp->cExte with cFileExt(cPath)
			REPLACE temp->mImag with cMemo
			ferase(cTemp)
			msginfo('Imagem salva com sucesso !')
		else
		   ? 'Imagem não pode ser salva !'
		endif	
   else
	   oTela=nil
      oNome=nil
      oImage=nil
      lSalva=.F.

      memvar->cNome=SPACE(30)

      define dialog oTela from 01,01 to 20,60 title 'Lendo imagem em Memo'

      @ 01,01 say 'Digite o nome para imagem:' of oTela COLOR CLR_BLACK
      @ 2.5,01 get oNome VAR memvar->cNome of oTela 
   
		@ 05,01 button 'Ler' of oTela size 50,12 action (lSalva:=.t.,oTela:End()) CANCEL
	
	   activate dialog oTela centered
	   
	   if .not.lSalva
	      loop
		endif
      
      cMemo=''
      memvar->cExte=''
		
		temp->(dbgotop())
		while .not.temp->(eof())
		   if ALLTRIM(UPPER(temp->cNome)) == ALLTRIM(UPPER(memvar->cNome))
		      cMemo=temp->mImag
		      memvar->cExte=ALLTRIM(temp->cExte)
			endif
			temp->(dbskip())
		enddo	
		
		if empty(cMemo)
		   ? 'Arquivo não contém imagem com este nome !'
			loop
		endif
		
		cTemp = 'c:\temp\temp002.tmp'
		
		MEMOWRIT(cTemp,cMemo)
		
		if file(cTemp)
       	
			cTemp2 = 'c:\temp\temp003.'+memvar->cExte
			
			FMimeDec(cTemp,cTemp2)
			
			if file(cTemp2)
			   ferase(cTemp)
				ShellExecute(GetActiveWindow(),"open",cTemp2)
			   msginfo('Tecle algo para ler outra imagem','OK')
			   ferase(cTemp2)
			else
			   ? 'Imagem não pode ser lida  !'
			endif
		else
		   ? 'Imagem não pode ser lida  !'
		endif	
	endif   
enddo	   

return  
desta forma a imagem (qualquer extensão) está contida no campo MEMO do arquivo, certo ? quando eu precisar utilizá-la eu a salvo em um arquivo temp e realizo os procedimentos desejados...

no exemplo, estou somente visualizando, mas se eu precisar exibi-la em uma dialog por exemplo, seria somente fazer:

Code: Select all

01,01 IMAGE oImage FILANEM cTemp2 SIZE 100,50 OF oTela , etc, etc,
e depois de encerrar o dialogo deletar o arq temp

espero q te ajude

um abraço