BMP distorcido no QRCode PIX
Enviado: 17 Mar 2023 14:45
Olá, saudações a todos
A questão com o BMP gerado pelo QRCodeLib.dll (tanto o FastQRCode como o FullQRCode) é a seguinte:
1) Quando abro pelo PAINT, IrfanView ou outro, abre perfeitamente 2) Quando abro pelo sistema (Image, Button, etc) abre truncado
Tentando contornar isso, pensei em converter de BMP para JPG ou PNG com FreeImage e....
1) Convertendo para JPG, gera um jpg com 0 bytes 2) Convertendo para PNG, gera um png com o mesmo problema do BMP
Acho que tenho então duas questões em uma:
a) Como fazer abrir o BMP pelo IMAGE ou Button, da mesma forma como abre no PAINT/IrfanView/outros ?
b) Converter com FreeImage este BMP gerado não é possível?
Segue código completo que estou usando, lembrando que a geração da String do PIX (StringPix()) está funcionando corretamente.
Depois de uma semana de luta sozinho, recorro à sabedoria de vocês que tanto têm me ajudado.
Márcio.´.
A questão com o BMP gerado pelo QRCodeLib.dll (tanto o FastQRCode como o FullQRCode) é a seguinte:
1) Quando abro pelo PAINT, IrfanView ou outro, abre perfeitamente 2) Quando abro pelo sistema (Image, Button, etc) abre truncado
Tentando contornar isso, pensei em converter de BMP para JPG ou PNG com FreeImage e....
1) Convertendo para JPG, gera um jpg com 0 bytes 2) Convertendo para PNG, gera um png com o mesmo problema do BMP
Acho que tenho então duas questões em uma:
a) Como fazer abrir o BMP pelo IMAGE ou Button, da mesma forma como abre no PAINT/IrfanView/outros ?
b) Converter com FreeImage este BMP gerado não é possível?
Segue código completo que estou usando, lembrando que a geração da String do PIX (StringPix()) está funcionando corretamente.
Código: Selecionar todos
***** prog de testes
#include "minigui.ch"
#include "hbdyn.ch"
#include "freeimage\FreeImag.ch"
#require "hbfimage"
Function Main()
HB_GTSYS()
**** Parametros Basicos cadastro da Empresa ****
cPIX_KEY := "+5511900000000" // chave pix (CNPJ, email, celular)
cPIX_RECEIVER := "Marcio Martins Moreira" // Nome do Proprietario do PIX
cPIX_CITY := "Sao Paulo" // Nome da Cidade do proprietario do PIX
cPIX_ZIPCODE := ""
**** Dados Dinamicos no momentos da Geracao
nPIX_AMOUNT := 1.25 // Valor do PIX
cPIX_DESCRIPTION := "Ped:12345 e demais dados"
cPIX_IDENTIFICATION := "Identificacao"
**** Gera String - Testada e OK! ****
cString = StringPIX ( nPIX_AMOUNT , cPIX_KEY , cPIX_RECEIVER , cPIX_CITY , cPIX_ZIPCODE , cPIX_DESCRIPTION , cPIX_IDENTIFICATION )
***** ATÉ AQUI, TUDO BEM !!!
cFile := "arq"
IF QRCode(cString , cFile+".bmp" ) && Se Gerou arquivo BMP
**** Gera JPG e PNG a partir do BMP (FreeImage) ****
GeraJPGPNG(cFile)
**** Mostra o BMP na Tela ****
ShowQRCode(cFile, cPIX_Description)
ENDIF
Return Nil
FUNCTION QRcode( cStr, cFile , lFull )
lFull = iif(type("lFull")="L",lFull,.f.)
hLib := hb_libLoad( "QRCodeLib.dll" )
if lFull
hb_DynCall( { "FullQRCode", hLib, HB_DYN_CALLCONV_STDCALL }, .T., .F.,;
RGBCor(255,255,255), RGBCor(0,0,0), cStr, ;
3, 1,;
5, 5, 200, 200, cFile )
else
hb_DynCall( { "FastQRCode", hLib, HB_DYN_CALLCONV_STDCALL}, cStr, cFile )
endif
hb_libFree( hLib )
RETURN file(cFile)
FUNCTION RGBCor( nRed, nGreen, nBlue )
RETURN ( nRed + ( nGreen * 256 ) + ( nBlue * 65536 ) )
Function GeraJPGPNG(cFile)
fi_Initialise()
im := fi_Load( FIF_BMP, cFile+".bmp", BMP_DEFAULT )
nwidthimg := fi_GetWidth( im )
nheightimg := fi_GetHeight( im )
fi_Save( FIF_PNG, im, cFile+".png", PNG_DEFAULT )
fi_Save( FIF_JPEG, im, cFile+".jpg", JPEG_DEFAULT )
fi_DeInitialise()
Return Nil
Function ShowQRCode (cFile , cPIX_Description)
DEFINE WINDOW ShowQRCode ;
AT 0,0 ;
WIDTH GetDeskTopWidth()/2 ;
HEIGHT GetDeskTopHeight()/2 ;
TITLE "PIX:"+cPIX_Description ;
main ;
BACKCOLOR {0,0,0}
DEFINE IMAGE Image_1
ROW 50
COL 50
WIDTH 200
HEIGHT 200
PICTURE cFile+".bmp"
VISIBLE .T.
STRETCH .t.
end image
DEFINE BUTTON Button_x
ROW 50
COL 350
WIDTH 200
HEIGHT 200
ACTION ShowQRCode.release
FONTNAME "Arial"
FONTSIZE 9
VISIBLE .t.
PICTURE cFile+".bmp"
END BUTTON
END WINDOW
ShowQRCode.Center
ShowQRCode.Activate
return Nil
**** GERACAO DE STRING FUNCIONANDO
**** TESTADO - Marco/2023
function StringPIX()
parameters nPIX_AMOUNT , cPIX_KEY , cPIX_RECEIVER , cPIX_CITY , cPIX_ZIPCODE , cPIX_DESCRIPTION , cPIX_IDENTIFICATION
Private cString
cString := ""
cString += get_p_value('00', '01')
cString += get_p_value('01', '11')
cString += get_p_account_information(cPIX_KEY, cPIX_DESCRIPTION)
cString += get_p_value('52', '0000')
cString += get_p_value('53', '986')
cString += get_p_value('54', alltrim(str(nPIX_AMOUNT)))
cString += get_p_value('58', 'BR')
cString += get_p_value('59', cPIX_RECEIVER)
cString += get_p_value('60', cPIX_CITY)
** cString += get_p_value('61', '')
cString += get_p_additional_data_field(cPIX_IDENTIFICATION)
cString += "6304"
cString += hb_numtohex(hb_crcct(cString, 0xFFFF, 0x11021))
return cString
function get_p_value(identify, value)
return trim(identify + strzero(len(alltrim(value)), 2) + value)
function get_p_account_information(key, description)
Local base_pix := get_p_value('00', 'br.gov.bcb.pix')
Local info_string := ''
info_string += get_p_value('01', key)
info_string += get_p_value('02', description)
return get_p_value('26', base_pix + info_string)
function get_p_additional_data_field(identification)
if identification != Nil
return get_p_value('62', get_p_value('05', identification))
else
return get_p_value('62', get_p_value('05', '***'))
endif
return
Márcio.´.