Marca Posted March 31, 2016 Report Share Posted March 31, 2016 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 ? Ronaldbuch 1 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted March 31, 2016 Report Share Posted March 31, 2016 o Melhor: http://www.irfanview.com/ Se ele não abrir, já elvis a imagem. Via Fivewin, vc. pode testar assim: http://forums.fivetechsupport.com/viewtopic.php?p=121785#p121785 Abs Quote Link to comment Share on other sites More sharing options...
Marca Posted March 31, 2016 Author Report Share Posted March 31, 2016 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 Quote Link to comment Share on other sites More sharing options...
evertonlb Posted April 1, 2016 Report Share Posted April 1, 2016 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 Quote Link to comment Share on other sites More sharing options...
sygecom Posted April 1, 2016 Report Share Posted April 1, 2016 Aqui verificamos o se MD5 dos arquivos usado no sistema está OK com o previsto: HB_MD5('c:\foto.jpg') Temos uma tabela de arquivos e seus MD5 para comparar. Quote Link to comment Share on other sites More sharing options...
Marca Posted April 1, 2016 Author Report Share Posted April 1, 2016 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. Quote Link to comment Share on other sites More sharing options...
oliveiros Posted April 1, 2016 Report Share Posted April 1, 2016 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 Theotokos and kapiaba 2 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted April 1, 2016 Report Share Posted April 1, 2016 O seu ERRSYSW.PRG reage? http://fivewin.com.br/index.php?/topic/21581-bloquear-o-error-dos-64-no-errsyswprg/ Quote Link to comment Share on other sites More sharing options...
Marca Posted April 1, 2016 Author Report Share Posted April 1, 2016 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. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted April 1, 2016 Report Share Posted April 1, 2016 Neste caso, você vai ter que estabelecer um padrão para o Cliente, pois se a imagem estiver corrupta ou com um tamanho excessivo(BMP) travará a memória da máquina. Principalmente se tiver menos de 8 Gbs de Ram. Quote Link to comment Share on other sites More sharing options...
Theotokos Posted April 2, 2016 Report Share Posted April 2, 2016 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!!! Quote Link to comment Share on other sites More sharing options...
emotta Posted April 21, 2016 Report Share Posted April 21, 2016 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 Theotokos 1 Quote Link to comment Share on other sites More sharing options...
emotta Posted April 23, 2016 Report Share Posted April 23, 2016 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 Quote Link to comment Share on other sites More sharing options...
rochinha Posted April 24, 2016 Report Share Posted April 24, 2016 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." Quote Link to comment Share on other sites More sharing options...
emotta Posted April 25, 2016 Report Share Posted April 25, 2016 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." Quote Link to comment Share on other sites More sharing options...
rochinha Posted April 25, 2016 Report Share Posted April 25, 2016 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. Quote Link to comment Share on other sites More sharing options...
emotta Posted April 26, 2016 Report Share Posted April 26, 2016 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 Quote Link to comment Share on other sites More sharing options...
rochinha Posted April 26, 2016 Report Share Posted April 26, 2016 Amiguinhos, emotta show-de-bola! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.