Jump to content
Fivewin Brasil

Problemas com Bmp/Jpg


Marca

Recommended Posts

Olá Pessoal bom dia.

Alguem sabe como fazer pra saber se o bmp ou o jpg esta íntegro ?

Tive um problema hoje que o sistema não abria de jeito algum em devido a um virus ter detonados os jpg que utilizo no sistema

Existe alguma maneira de verificar estes arquivos ?

REDEFINE oImg ID 10 OF oDlg FILENAME "c:\imagens\imagemescolhida.jpg" adjust

Sendo que este jpg estava corrompido e isso fazia com que o sistema não saisse daqui.

Outro problema que estou tendo é não conseguir copiar e colar nada aqui no forum

Alguém ja passou por isso ?

Link to comment
Share on other sites

Olá João

Boa tarde

Oque preciso é saber antes de rodar se o bmp ou jpg não esta corrompido. Nestes exemplos ai não encontrei nada que faça referência a isso

Marcelo.. sinceramente não creio que seja muito frequente este problema.. Ao menos EU não me lembro de um fato similar!

Pode ser que você trabalhe muito para resolver um problema que é altamente esporádico!!!

Não sei o "caminho das pedras" mas eu tentaria guardar o tamanho do arquivo, data de modificação e sei lá mais o que, acho que isso dará

um Norte num caso futuro!

Att.

Everton

Link to comment
Share on other sites

Bom dia a todos

Esta do md5 pode ser um bom caminho vamos ver se alguém tem alguma outra experiência com o caso.

Pra quem quiser testar e entender o problema é simples pra simular

Pegue alguma tela do sistema que utilize a sintax do redefine que postei acima

Crie primeiro uma cópia do jpg pra depois retornar.

Abra o mesmo com um bloco de notas remova parte das linhas pra danificar este jpg e salve de volta.
Após isso tentem abrir a parte do sistema que usa e verão o problema.

Link to comment
Share on other sites

Olá Marcelo,

Vou tomar a liberdade de sugerir uma coisa: Coloque suas imagens em um RC ou quantos necessários e compile junto com seu programa, fica mais fácil de administrar; Agora se você precisa trabalhar com imagens externas, recomendo que grave a imagem em uma tabela e abra quando necessário.

Tanto em DBF ou MySQL esse processo é fácil de fazer, se precisar de dica me avisa.

Att.,

Oliveiros Junior

Link to comment
Share on other sites

Olá Oliveiros boa tarde.

São muitas as imagens e algumas delas o cliente que coloca a que ele quer como o plano de fundo da entrada do sistema com isso não teria como resolver esta parte e fora que o tamanho do executável ficaria muito grande.

As imagens de produtos , clientes , etc. já são no banco de dados.

João. o sistema não da erro simplesmente não passa daquele ponto onde tem o redefine.

Link to comment
Share on other sites

Olá Marcelo,

Vou tomar a liberdade de sugerir uma coisa: Coloque suas imagens em um RC ou quantos necessários e compile junto com seu programa, fica mais fácil de administrar; Agora se você precisa trabalhar com imagens externas, recomendo que grave a imagem em uma tabela e abra quando necessário.

Tanto em DBF ou MySQL esse processo é fácil de fazer, se precisar de dica me avisa.

Att.,

Oliveiros Junior

Boa Tarde Oliveiros!!! Poderia compartilhar conosco a rotina que usa para gravar imagem em DBF como é feito isto? Desde já meu muito obrigado, fk com Deus!!!

Link to comment
Share on other sites

  • 3 weeks later...

Pessoal fiz a função, fucei na classe TIMAGE e encontrei uma maneira de identificar se o arquivo é uma imagem válida. Segue a função e o exemplo de uso.

Function u_Teste()
Local cFile := cGetFile( "*.*", "Seleccione um arquivo" )
If ValidJpg(cFile)
   Mensagem("JPG VALIDO")
Else
   Mensagem("JPG INVALIDO")
EndIf
Return

Static Function ValidJpg(cArq)
Local nRet := FITypeFromMemory(MemoRead(cArq))
Return nRet >= 0
Link to comment
Share on other sites

Se alguém quiser eliminar de vez o problema de travar o programa ou ficar doidão ao abrir um JPG inválido via TIMAGE é só compilar o código abaixo no seu script de compilação. Ele vai substituir a função padrão do LOADIMAGE por uma que verifica que a imagem é válida, se for inválida em RUNTIME ele cria uma imagem JPG em branco em uma pasta temporária e exibe ela.

No seu código, antes de dar o LOADIMAGE você pode verificar se a imagem é valida através do ISVALIDIMAGE mas caso não verifique a rotina internamente faz o tratamento e exibe o JPG em branco, pelo menos não vai mais travar.


//----------------------------------------------------------------------------//

#ifndef CBM_INIT
   #define CBM_INIT       4
#endif
#ifndef DIB_RGB_COLORS
   #define DIB_RGB_COLORS 0
#endif

function FILOADIMG( cFile, nFormat, cResFile )

   local hDib, hInfoH, hInfo, hBits, hWnd, hDC, hBmp
   local cFileTemp := ""

   if Upper( cFileExt( cFile ) ) = "BMP"
      return ReadBitmap( 0, cFile )
   endif
   
   If !IsValidImage(cFile)
      cFileTemp := TmpFile("jpg")
      CriaJPGEmBranco(cFileTemp)
      cFile := cFileTemp
   EndIf
   
   if LoadFreeImage( cResFile ) > 32

      nFormat = FIGETFILETYPE( cFile, 0 )
      hDib    = FILOAD( nFormat, cFile, 0 )
      hInfoH  = FIGETINFOHEADER( hDib )
      hInfo   = FIGETINFO( hDib )
      hBits   = FIGETBITS( hDib )
      hWnd    = GETDESKTOPWINDOW()

      #ifdef __CLIPPER__
         hDC = GETDC32( hWnd )
      #else
        hDC = GETDC( hWnd )
      #endif

      hBmp = CreateDiBitmap( hDC, hInfoH, CBM_INIT, hBits, hInfo, DIB_RGB_COLORS )

      ReleaseDC( hWnd, hDC )
      FIUNLOAD( hDib )

   endif
   
   If !Empty(cFileTemp)
      fErase(cFileTemp)
   EndIf

return hBmp

//----------------------------------------------------------------------------//

Function IsValidImage(cArq)
Return FITypeFromMemory(MemoRead(cArq)) >= 0

//----------------------------------------------------------------------------//

Static Function CriaJPGEmBranco(cFile)
Local cStr := "FFD8FFE000104A46494600010101006000600000FFE100224578696600004D4D002A00000008000101120003000000010001000000000000FFDB0043000201010201010202020202020202030503030303030604040305070607070706070708090B0908080A0807070A0D0A0A0B0C0C0C0C07090E0F0D0C0E0B0C0C0CFFDB004301020202030303060303060C0807080C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC00011080001000103012200021101031101FFC4001F0000010501010101010100000000000000000102030405060708090A0BFFC400B5"
cStr+="100002010303020403050504040000017D01020300041105122131410613516107227114328191A1082342B1C11552D1F02433627282090A161718191A25262728292A3435363738393A434445464748494A535455565758595A636465666768696A737475767778797A838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F0100030101010101010101010000000000000102030405060708090A0BFFC400B511000201020404030407050404000102770001020311040521310612415107617113"
cStr+="22328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A35363738393A434445464748494A535455565758595A636465666768696A737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00FDFCA28A2803FFD9"
MemoWrit(cFile,HexToSTr(cStr))
Return cFile

//----------------------------------------------------------------------------//

Static Function TmpFile(cExt)
Local cTmpDir := GetEnv( "TEMP" ) + "\"          // LK Mar/26/2008 added path to avoid file being created in _SET_DEFAULT directory
Local cTmpName := "__temp"
Default cExt := "tmp"

Do While File( cTmpName := cTmpDir + "__" + StrZero( nRandom( 99999 ), 5 ) + "."+cExt )
Enddo
FClose( FCreate( cTmpName ) )

Return cTmpName

Link to comment
Share on other sites

Amiguinhos,

A tempos também uso TImage para manipular imagens em meus sistemas, mas somente para armazenar fotos para serem inseridas em crachas(quase não uso).

Bom, também corri atrás, anos atrás, atrás de inserir fotos em minhas tabelas. Consegui usando algumas funções de transformação, assim:

static function LeImagemParaMemoria( _imagem_ )
   RETURN str2hex( memoread( _imagem_ ) )

static function SalvaImagemNoDisco( _campo_, _imagem_ )
   RETURN memowrit( _imagem_, hex2str( _campo_ ) )

A função LeImagemParaMemoria( _imagem_ ) recebe como parâmetro o local da imagem, e a transforma em hexadecimal.

cHexaDaImagem := LeImagemParaMemoria( "C:\TEMP\FOTO01.JPG" )

Com o conteúdo transformado, ficava mais fácil salvá-lo em um campo memo de forma que não acontecesse corrupções. É bem provável que usando MemoRead( "C:\TEMP\FOTO01.JPG" ) possamos salvar o .JPG direto no campo, mas pode haver corrompimento do código da imagem. Ao transformar em Hexadecimal, como tudo é texto dificilmente haverá corrompimento.

Ai um belo dia quero visualizar a imagem armazenada em minha tabela, então uso o comando SalvaImagemNoDisco().

...

SalvaImagemNoDisco( ESTOQUE->FOTO, 'C:\TEMP\TEMPO.JPG" )

...

Aqui ocorre o inverso, o conteúdo hexadecimal é transformado no código original da imagem e salvo no arquivo TEMPOrário podendo ser visualizado com as funções da classe TImage.

Vou mais além.

Sua aplicação salva imagens de produtos, funcionário, etc, para algum motivo gerencial. Então você coloca a vitima em frente uma webcam e captura a imagem e salva em algum lugar ou tira fotos com sua câmera digital e as transfere para outro lugar.

Bom, se você usar a classe TWebCam, do fivewinner TheFull, com certeza poderá ter embutida em seus cadastros a opção de tirar foto e já armazenar nas tabelas.

Aliando com as funções acima, é possível antes de recuperar as imagens testá-las antes de visualizar para não ocorrerem imprevistos.

Vale lembrar que estes meus testes e uso se basearam na medida de tamanho de campos memos com no máximo 64k. Com o Harbour não sei se o limite continua sendo este, mas seria possível salvar imagem com mais Kzinhos.

Finalizando, armazenar imagens em bancos de dados, inclusive .DBF é o sonho de todos nós, só porque os grandes SGDBs o fazem, mas eles são outro naipe no quesito database.

Se for para armazenar imagem em um invólucro .DBF que este seja separado para não tornar a tabela principal peada demais para o trabalho diário.

Estas são as minhas dicas de hoje.

Peraí, voltei:

DLL32 FUNCTION DIBmpToJpg(SrcPath As String, DestPath As String, Quality As Long, progressive As Long) AS LONG PASCAL LIB "JPGDLL32.dll"

Achei esta pérola, basta pesquisar na internet pela tal .DLL.

"Estando bem para ambas as partes...Celso RochÉOMano se despede."

Link to comment
Share on other sites

vlw Rochinha mas já consegui resolver !

obrigado

Amiguinhos,

A tempos também uso TImage para manipular imagens em meus sistemas, mas somente para armazenar fotos para serem inseridas em crachas(quase não uso).

Bom, também corri atrás, anos atrás, atrás de inserir fotos em minhas tabelas. Consegui usando algumas funções de transformação, assim:

static function LeImagemParaMemoria( _imagem_ )
   RETURN str2hex( memoread( _imagem_ ) )

static function SalvaImagemNoDisco( _campo_, _imagem_ )
   RETURN memowrit( _imagem_, hex2str( _campo_ ) )

A função LeImagemParaMemoria( _imagem_ ) recebe como parâmetro o local da imagem, e a transforma em hexadecimal.

cHexaDaImagem := LeImagemParaMemoria( "C:\TEMP\FOTO01.JPG" )

Com o conteúdo transformado, ficava mais fácil salvá-lo em um campo memo de forma que não acontecesse corrupções. É bem provável que usando MemoRead( "C:\TEMP\FOTO01.JPG" ) possamos salvar o .JPG direto no campo, mas pode haver corrompimento do código da imagem. Ao transformar em Hexadecimal, como tudo é texto dificilmente haverá corrompimento.

Ai um belo dia quero visualizar a imagem armazenada em minha tabela, então uso o comando SalvaImagemNoDisco().

...

SalvaImagemNoDisco( ESTOQUE->FOTO, 'C:\TEMP\TEMPO.JPG" )

...

Aqui ocorre o inverso, o conteúdo hexadecimal é transformado no código original da imagem e salvo no arquivo TEMPOrário podendo ser visualizado com as funções da classe TImage.

Vou mais além.

Sua aplicação salva imagens de produtos, funcionário, etc, para algum motivo gerencial. Então você coloca a vitima em frente uma webcam e captura a imagem e salva em algum lugar ou tira fotos com sua câmera digital e as transfere para outro lugar.

Bom, se você usar a classe TWebCam, do fivewinner TheFull, com certeza poderá ter embutida em seus cadastros a opção de tirar foto e já armazenar nas tabelas.

Aliando com as funções acima, é possível antes de recuperar as imagens testá-las antes de visualizar para não ocorrerem imprevistos.

Vale lembrar que estes meus testes e uso se basearam na medida de tamanho de campos memos com no máximo 64k. Com o Harbour não sei se o limite continua sendo este, mas seria possível salvar imagem com mais Kzinhos.

Finalizando, armazenar imagens em bancos de dados, inclusive .DBF é o sonho de todos nós, só porque os grandes SGDBs o fazem, mas eles são outro naipe no quesito database.

Se for para armazenar imagem em um invólucro .DBF que este seja separado para não tornar a tabela principal peada demais para o trabalho diário.

Estas são as minhas dicas de hoje.

Peraí, voltei:

DLL32 FUNCTION DIBmpToJpg(SrcPath As String, DestPath As String, Quality As Long, progressive As Long) AS LONG PASCAL LIB "JPGDLL32.dll"

Achei esta pérola, basta pesquisar na internet pela tal .DLL.

"Estando bem para ambas as partes...Celso RochÉOMano se despede."

Link to comment
Share on other sites

ah blz... perdão, eu nao li direito aquela hora... ótima dica...

também tem como verificar pela STRING se o JPG é válido... é só mudar a função e fazer assim:

Com isso na função IsValidImagem você pode passar ou o arquivo ou o conteudo do seu banco de dados, exemplo:


cFile := "c:\sistema\fotos\funcionario.jpg"
IsValidImagem(cFile)

// ou

cFile := "c:\sistema\fotos\funcionario.jpg"
cImagem := MemoRead(cFile)
IsValidImagem(cImagem)



Function IsValidImage(cArq)
Return FITypeFromMemory(If(File(cArq),MemoRead(cArq),cArq)) >= 0
 

Abraços

Amiguinhos,

emotta

Eu já havia percebido e portanto o meu post seria um adicional ao seu resultado já que o seu critica o arquivo e o meu armazena.

Function IsValidImage(cArq)

Return FITypeFromMemory(If(File(cArq),MemoRead(cArq),cArq)) >= 0

Link to comment
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
Reply to this topic...

×   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.

Loading...
×
×
  • Create New...