ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

TImage pra Txt e Txt pra TImage

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
daniel_paixao
Novato
Novato


Registrado: Sexta-Feira, 13 de Abril de 2012
Mensagens: 10
Localização: Cascavel, PR

MensagemEnviada: Sex Mai 22, 2015 5:37 pm    Assunto: TImage pra Txt e Txt pra TImage Responder com Citação

Galera, seguinte, estou com um problema: Preciso salvar uma imagem em JPEG que está num TImage no meu banco de dados. Só que eu quero salvar apenas os bytes da imagem em um campo Varchar. Eu consigo transformar o JPEG de um TImage e texto e salva-lo sem problemas porem, na hora de recuperar, simplesmente não vem. Detalhe: Eu não quero salvar em campo blob, minha necessidade é outra: Eu realmente preciso salvar os bytes da imagem e deppois recupera-la. Pergunto: Isso é possível? Alguem teria um exemplo de como se faz isso? Abraco.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
leandroksc
Profissional
Profissional


Registrado: Quinta-Feira, 29 de Setembro de 2011
Mensagens: 528

MensagemEnviada: Sex Mai 22, 2015 5:55 pm    Assunto: Responder com Citação

Vc pode usar Base64 para isso. Dependendo a versão do seu Delphi, este help pode ajudar:
http://docwiki.embarcadero.com/Libraries/XE8/en/System.NetEncoding.TNetEncoding.Base64

Espero que ajude!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
daniel_paixao
Novato
Novato


Registrado: Sexta-Feira, 13 de Abril de 2012
Mensagens: 10
Localização: Cascavel, PR

MensagemEnviada: Seg Mai 25, 2015 10:13 am    Assunto: Responder com Citação

leandroksc escreveu:
Vc pode usar Base64 para isso. Dependendo a versão do seu Delphi, este help pode ajudar:
http://docwiki.embarcadero.com/Libraries/XE8/en/System.NetEncoding.TNetEncoding.Base64

Espero que ajude!


Meu Delphi é o 2007. Acho que não vai funcionar.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Mai 25, 2015 11:28 am    Assunto: Responder com Citação

transforme o arquivo jpeg em um arquivo hexadecimal depois basta copiar o conteúdo e jogar no campo varchar, para exibir o conteúdo novamente precisa remontar o arquivo jpeg através do hexadecimal

no post aqui mostra como converter trabar com arquivo e hexdecimal
http://www.activedelphi.com.br/forum/viewtopic.php?t=84854
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
daniel_paixao
Novato
Novato


Registrado: Sexta-Feira, 13 de Abril de 2012
Mensagens: 10
Localização: Cascavel, PR

MensagemEnviada: Qua Mai 27, 2015 12:25 pm    Assunto: Responder com Citação

strak2012 escreveu:
transforme o arquivo jpeg em um arquivo hexadecimal depois basta copiar o conteúdo e jogar no campo varchar, para exibir o conteúdo novamente precisa remontar o arquivo jpeg através do hexadecimal

no post aqui mostra como converter trabar com arquivo e hexdecimal
http://www.activedelphi.com.br/forum/viewtopic.php?t=84854


Cara, não teria como você fazer ai pra mim um exemplo de como transformar a imagem que está no TImage em arquivo texto e depois fazer o processo contrario??
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Mai 28, 2015 8:40 am    Assunto: Responder com Citação

Código:
   

...

{ Private declarations }
  public
    { Public declarations }
    myhex: string;
  end;

var
  Form1: TForm1;
  // 52428800 -> 50mb em bytes
  //  6553600 -> 50mb em longint
  // 50mb de tamanho deve servir para dll
  buff: array [0 .. 6553600] of longint;

implementation

{$R *.dfm}

function file2hex(Arquivo: string): string;
var
  INFile: file of longint;
  I, len: longint;
begin
  AssignFile(INFile, Arquivo);
  Reset(INFile);
  len := filesize(INFile);
  BlockRead(INFile, buff, len); // ler o arquivo de uma só vez
  result := '';
  for I := 0 to len - 1 do
    result := result + inttohex(buff[I], 8);
  CloseFile(INFile);
end;

procedure hex2File(HexText, Arquivo: string);
var
  INFile: file of longint;
  I, len: longint;
begin
  len := length(HexText) div 8;
  for I := 1 to len do
    buff[I - 1] := strtoint('$' + copy(HexText, (I - 1) * 8 + 1, 8));
  AssignFile(INFile, Arquivo);
  Rewrite(INFile);
  Reset(INFile);
  BlockWrite(INFile, buff, len);
  CloseFile(INFile);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    myhex := file2hex(OpenDialog1.FileName); // converte um arquivo em texto hex
    Memo1.Lines.Text := myhex;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  nome: string;
begin
  nome := extractfilepath(application.ExeName) + 'outfile.jpg';
  hex2File(myhex, nome); //<- convert o texto em hex para um arquivo
  Image1.Picture.LoadFromFile(nome);
  deletefile(nome);
end;


Dependendo o tamanho da imagem jgp a conversão para hex da mesma pode demorar um pouco
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Mai 28, 2015 8:51 am    Assunto: Responder com Citação

Segue o link para download dos fontes + aplicação
http://htmlbasic.esy.es/filehost/JpgToHexToJpg.rar

Dos meus testes

_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
daniel_paixao
Novato
Novato


Registrado: Sexta-Feira, 13 de Abril de 2012
Mensagens: 10
Localização: Cascavel, PR

MensagemEnviada: Qui Mai 28, 2015 4:37 pm    Assunto: Responder com Citação

strak2012 escreveu:
Segue o link para download dos fontes + aplicação
http://htmlbasic.esy.es/filehost/JpgToHexToJpg.rar

Dos meus testes


CAra, não querendo abusar mas... teria como vc me mandar um exemplo convertendo direto do TImage pra Texto e depois o processo contrario? Tipo, eu não queria pegar pelo FileName, mas sim, direto pelo TImage por que hoje eu tenho uma rotina que tira foto pela webcam e joga num TImage
manja?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Mai 28, 2015 9:18 pm    Assunto: Responder com Citação

vou ver se faço um exemplo aqui, o segredo para isso estará no TmemoryStream;
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Mai 28, 2015 10:44 pm    Assunto: Responder com Citação

Segue o código

Código:
unit umain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, jpeg,
  Vcl.Imaging.pngimage;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Panel2: TPanel;
    Image1: TImage;
    Image2: TImage;
    Panel3: TPanel;
    Memo1: TMemo;
    Panel1: TPanel;
    Button2: TButton;
    Button1: TButton;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    TextoHex: string;
    function StreamToHex(ms: TMemoryStream): string;
    procedure HexToStream(TextoHex: string; ms: TMemoryStream);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.StreamToHex(ms: TMemoryStream): string;
var
  i: Integer;
  tam: longint;
  v: byte;
  txt: string;
begin
  tam := ms.Size;
  ms.Position := 0;
  TextoHex := '';
  for i := 1 to tam do
  begin
    ms.Read(v, 1);
    result := result + inttohex(v, 2);
  end;
end;

procedure TForm1.HexToStream(TextoHex: string; ms: TMemoryStream);
var
  i: Integer;
  tam: longint;
  v: byte;
  txt: string;
begin
  tam := length(TextoHex) div 2;
  ms.SetSize(tam);
  ms.Position := 0;
  for i := 1 to tam do
  begin
    v := strtoint('$' + copy(TextoHex, ((i - 1) * 2) + 1, 2));
    ms.Write(v, 1);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  if TJPEGImage(Image1.Picture.Graphic) <> nil then
    TJPEGImage(Image1.Picture.Graphic).SaveToStream(ms)
  else if TJPEGImage(Image1.Picture.Graphic) <> nil then
    TJPEGImage(Image1.Picture.Graphic).SaveToStream(ms)
  else if TPngImage(Image1.Picture.Graphic) <> nil then
    TPngImage(Image1.Picture.Graphic).SaveToStream(ms);
  StaticText2.Caption := 'Convertendo para hex-texto';
  StaticText2.Refresh;
  TextoHex := StreamToHex(ms);
  StaticText2.Caption := 'Pronto';
  StaticText2.Refresh;
  ms.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  ms: TMemoryStream;
  jpg: TJPEGImage;
  bmp: Tbitmap;
  png: TPngImage;
  jpgok: boolean;
  bmpok: boolean;
  pngok: boolean;
  erro: boolean;
  s: string;
begin
  jpg := TJPEGImage.Create;
  bmp := Tbitmap.Create;
  png := TPngImage.Create;
  ms := TMemoryStream.Create;
  HexToStream(TextoHex, ms);
  // BM
  bmpok := pos('424D', TextoHex) = 1; // é um bmp
  // ‰PNG
  pngok := pos('89504E47', TextoHex) = 1; // é um png
  // 'JFIF'
  jpgok := pos('4A464946', TextoHex) < 50; // é um jpg
  ms.Position := 0;
  if bmpok then
  begin
    bmp.LoadFromStream(ms);
    Image2.Picture.Assign(bmp);
  end
  else if pngok then
  begin
    png.LoadFromStream(ms);
    Image2.Picture.Assign(png);
  end
  else if jpgok then
  begin
    jpg.LoadFromStream(ms);
    Image2.Picture.Assign(jpg);
  end;
  ms.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  mstr: string;
begin
  mstr := 'Tem certeza que deseja visualizar o texto hexdecimal no memo?' +
    #13#10 + 'Esta operação costuma demorar muito! São ' +
    formatfloat('#,###,###,###0', length(TextoHex)) +
    ' bytes a ser copiados ou seja' + #13#10 + formatfloat('#,###,###,###0',
    length(TextoHex) div 1024) + ' Kb';
  if length(TextoHex) > 0 then
    if MessageDlg(mstr, mtCustom, [mbYes, mbNo], 0) = mrYes then
    begin
      StaticText2.Caption := 'Passando para o memo';
      StaticText2.Repaint;
      Memo1.Lines.Text := TextoHex;
      StaticText2.Caption := 'Pronto';
      StaticText2.Refresh;
    end;
end;

end.

_________________
Tudo podemos quando tudo sabemos!


Editado pela última vez por strak2012 em Qui Mai 28, 2015 10:49 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Mai 28, 2015 10:47 pm    Assunto: Responder com Citação

fonte do exemplo+aplicação
http://htmlbasic.esy.es/filehost/JpgToHexToJpgV2.rar

Dos meus testes

_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Mai 28, 2015 10:58 pm    Assunto: Responder com Citação

Atenção:
Uma imagem de 100k representa 100*1024 bytes logo 102.400 bytes, isso para ser passado para um componente texto tal como Tmemo pode levar muito tempo a ideia é mante-lo sempre em uma string normal e trabalhar com assim mesmo.

Procure não usar imagem do tipo bmp pois esta tem um maior peso uma vez que a mesma não possui qualquer compressão, ao invés disso procure usar png ou jpg dê preferencia a png uma vez que a compressão deste formato é a melhor sem perca de qualidade da imagem.

Procure tb não usar imagem gigantes tipo altura x largura.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
daniel_paixao
Novato
Novato


Registrado: Sexta-Feira, 13 de Abril de 2012
Mensagens: 10
Localização: Cascavel, PR

MensagemEnviada: Sex Mai 29, 2015 12:49 pm    Assunto: Responder com Citação

strak2012 escreveu:
Atenção:
Uma imagem de 100k representa 100*1024 bytes logo 102.400 bytes, isso para ser passado para um componente texto tal como Tmemo pode levar muito tempo a ideia é mante-lo sempre em uma string normal e trabalhar com assim mesmo.

Procure não usar imagem do tipo bmp pois esta tem um maior peso uma vez que a mesma não possui qualquer compressão, ao invés disso procure usar png ou jpg dê preferencia a png uma vez que a compressão deste formato é a melhor sem perca de qualidade da imagem.

Procure tb não usar imagem gigantes tipo altura x largura.


Então...e na sua opinião, será que eu eu conseguiria salvar essa Texto da imagem em um campo de banco de dados Firebird e depois recupera-lo de forma a montar a imagem novamente? Ou isso não é possível? EU pensei em criar uma tabela e cortar o texto em varias partes e guardar nessa tabela, pra esconder a imagem. É isso que eu preciso. Não poderia ser um campo Blob por que não me atenderia. Outra coisa: Eu tambem não quero usar os DataSets do Delphi pra guardar os dados, quero simplesmente fazer um comando insert com Format e passar a string mais ou menos assim: Texto := Format('INSERT INTO FOTO(IDDOC, SEQ,TEXTOFOTO) VALUES(%d,%d,%s)',[1,1,'GFDJHGFJHDGDDF564']). Você acha que é possível isso? Se sim, se você me der essa solução, pode passar a conta que te mando até uma grana.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Sex Mai 29, 2015 1:34 pm    Assunto: Responder com Citação

daniel_paixao escreveu:
strak2012 escreveu:
Atenção:
Uma imagem de 100k representa 100*1024 bytes logo 102.400 bytes, isso para ser passado para um componente texto tal como Tmemo pode levar muito tempo a ideia é mante-lo sempre em uma string normal e trabalhar com assim mesmo.

Procure não usar imagem do tipo bmp pois esta tem um maior peso uma vez que a mesma não possui qualquer compressão, ao invés disso procure usar png ou jpg dê preferencia a png uma vez que a compressão deste formato é a melhor sem perca de qualidade da imagem.

Procure tb não usar imagem gigantes tipo altura x largura.


Então...e na sua opinião, será que eu eu conseguiria salvar essa Texto da imagem em um campo de banco de dados Firebird e depois recupera-lo de forma a montar a imagem novamente? Ou isso não é possível? EU pensei em criar uma tabela e cortar o texto em varias partes e guardar nessa tabela, pra esconder a imagem. É isso que eu preciso. Não poderia ser um campo Blob por que não me atenderia. Outra coisa: Eu tambem não quero usar os DataSets do Delphi pra guardar os dados, quero simplesmente fazer um comando insert com Format e passar a string mais ou menos assim: Texto := Format('INSERT INTO FOTO(IDDOC, SEQ,TEXTOFOTO) VALUES(%d,%d,%s)',[1,1,'GFDJHGFJHDGDDF564']). Você acha que é possível isso? Se sim, se você me der essa solução, pode passar a conta que te mando até uma grana.


A resposta é sim desde que a imagens possua dimensões pequenas como foto de rotos de pessoas com uma dimensão de até 300x500, daria sem problema

Dos pontos mais importantes estão tamanho do arquivo em bytes, dimensão da imagem.

sim dá converter a grafica de um timage e enviar o para a base e recurar o próprio texto da base em seguida jogar em um timage sem problema
mais lembre uma imagem de 100kb possui 100x1024 ou seja 102.400 bytes ou chars em resumo seu varchar teria que suportar varchar(102400) olha que estamos falando apenas de 100kb

veja ai como tem sua base e depois retorne algo.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB