Fórum Converter para JPEG e enviar por socket #163953
01/06/2003
0
Abaixo segue o codigo:
Coloque isso no OnConnect do ServerSocket, por exemplo.
procedure TForm1.ssClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var
bmp:tbitmap;
jpg:tjpegimage;//coloque a unit jpeg no uses
st:tmemorystream;
begin
jpg:=nil;
bmp:=nil;
try
bmp:=tbitmap.create;
jpg:=tjpegimage.create;
bmp.width:=screen.width;
bmp.height:=screen.height;
bitblt(bmp.Canvas.handle,0,0,screen.width,screen.height,GetWindowDC(getdesktopwindow),0,0,srccopy);
jpg.assign(bmp);
jpg.compressionquality:=50;//qualidade da imagem 1..100
jpg.compress;
st:=tmemorystream.create;
jpg.savetostream(st);
st.position:=0;
socket.sendstreamthendrop(st);
// não precisa dar free no st, o socket vai dar um free
// automaticamente após enviar os dados
finally
bmp.free;
jpg.free;
end;
end;
O recebedor de tela:
Se você colocar o exemplo acima no OnConnect do server, você pode fazer o recebedor de tela assim:
procedure TForm1.Button1Click(Sender: TObject);
begin
cs.close;
cs.address:=´endereçoIP´;
cs.port:=portadoserversocket;
cs.open;
end;
procedure TForm1.csConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
arquivo:=tfilestream.create(´recebido.jpg´,fmcreate);
end;
procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket);
var
buf:array[0..1023] of byte;
begin
while socket.receivelength>0 do
arquivo.WriteBuffer(buf,socket.ReceiveBuf(buf,1024));
end;
procedure TForm1.csDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
arquivo.free;
end;
mas não funciona, não consigo visualizar a tela. Se encontrarem o porque de ela não funcionar ou tiverem outra forma de se fazer isso, desde já agradeço a ajuda
SANSES
´se tudo fosse fácil, seria mais dificil ainda´
Sanses
Curtir tópico
+ 0Posts
01/06/2003
Aroldo Zanela
A princípio não consegui visualizar realmente nenhum código pra exibir a imagem recebida. Mas me manda mas detalhes em MP ou no e-Mail pra ver se chegamos numa solução.
Gostei + 0
25/06/2003
Rabitz
Lembrem-se, que o fórum, é uma maneira de TODOS aprenderem com os erros e dúvidas de outros usuários.
Por isso e por estes assuntos referentes a sockets, serem muito visitados e consultados no fórum, peço, para que vocês postem o resultado aqui. Compartilhando com o resto, inclusive comigo, do conhecimento geral.
Outra coisa, para formar bons profissionais, é necessário que haja muita informação disponível. Infelizmente, para nós, brasileiros, existe pouca informação disponível. Disponibilizando do conhecimento geral, todos ganham.
Desculpem mais uma vez...
Rafael Rabitz
Gostei + 0
25/06/2003
Thaisandrade
Gostei + 0
25/06/2003
Smyle
abracos a todos
:idea:
Gostei + 0
29/06/2003
Morphadron
Deixa eu ver okhe eu entendi, e okhe vc quer??????
Capturar a tela;
Converter Bitmap em jpeg;
Enviar informações sobre o arquivo convertido;
E o cliente requisitar o download de arquivo salvo em disco;
Beleza, um réplica de NetBus!!!!!!, hehehehehe
Vou te ajudar!!!!!!!!!!
Function TForm1.capturaTela: BitMap;
Var
ScreenDC: HDC;
Arect: TRect;
Begin
ARect:= Rect (0,0,whidth, heigth);
Result:= TBitmap.Create;
With Result, ARect Do
Begin
Whith:= Screen.Whidth;
Heigth:= Screen.Heigth;
ScreenDC:= GetDC (0);
Try
BitBlt (Canvas.Handle, 0,0,Screen.Width,
Screen.Heigth, ScreenDC, Left, Top, ScrCopy);
Finally
ReleaseDC (0, ScreenDC);
End;
End;
End;
Análise do código
* Com Rect, capturamos as dimensões da área de trabalho e enviamos a variável Arect do tipo TRec;
* Criamos e manipulamos o bitmap com a própria variável de retorno, Result;
* Com BitBlt, transferimos os blocos de bits de um retangulo para outro dispositivo;
* E finalmente, ReleaseDC que libera um dispositivo de contexto.
******************************************************
Para Converter
Function TForm1.ConverteJpeg: String;
Var
Jpeg: TJepImage;
Stream:TMemoryStream;
Begin
Try
JPeg:=TJpegImage.Create;
With Jpeg Do
Begin
{True = P&B}
Grayscale:=False;
{Qualidade em 85¬}
CompressionQuality:=85;
{Pega BMP de retorno da Função}
Assign (BitMap);
Compress;
End;
Stream:=TMemoryStream.Create;
JPeg.SaveToStream (Stream);
Stream.Position:=0;
Stream.SaveToFile (´C:\Tela.Jpg´);
Stream.Free;
JPeg.Free;
Result:=InfoArquivo (´C:\Tela.Jpg´);
Except
Result:=´Opá deu Merda!!!! Arquivo não Encontrado!!!!!´;
End;
End;
Análise do Código;
* Criamos um variavel do tipo TjpegImag e configuramos a propriedade Grayscale para false. Caso Grayscale esteja configurado para true, o arquivo saira em tons de conja, reduzindo a qualidade e também o tamanho do arquivo. Configuramos tbm o CompressionQuality para 85¬;
* CompressionQuality varia de 1 a 100. Quanto maior for o valor de compressionQuality, melhor qualidade terá , e maior ele será tbm;
* Com o comando assign, fazemos com que a variavel Jpeg incorpore o arquivo Bitmap para, logo depois, chamarmos a função Compress que irá realizar a conversão desse arquivo;
***********************************************************
Salvamos Jpeg Na Variavel Stream para gravar o arquivo convertido em disco. Fazemos isto, pq Jpeg não tem a função SaveToFile;
***********************************************************
Abraços, Espero ter ajudado, apesar das brincadeiras....
Iter Vinícius - Morphadron
Gostei + 0
29/06/2003
Morphadron
Deixa eu ver okhe eu entendi, e okhe vc quer??????
Capturar a tela;
Converter Bitmap em jpeg;
Enviar informações sobre o arquivo convertido;
E o cliente requisitar o download de arquivo salvo em disco;
Beleza, um réplica de NetBus!!!!!!, hehehehehe
Vou te ajudar!!!!!!!!!!
Function TForm1.capturaTela: BitMap;
Var
ScreenDC: HDC;
Arect: TRect;
Begin
ARect:= Rect (0,0,whidth, heigth);
Result:= TBitmap.Create;
With Result, ARect Do
Begin
Whith:= Screen.Whidth;
Heigth:= Screen.Heigth;
ScreenDC:= GetDC (0);
Try
BitBlt (Canvas.Handle, 0,0,Screen.Width,
Screen.Heigth, ScreenDC, Left, Top, ScrCopy);
Finally
ReleaseDC (0, ScreenDC);
End;
End;
End;
Análise do código
* Com Rect, capturamos as dimensões da área de trabalho e enviamos a variável Arect do tipo TRec;
* Criamos e manipulamos o bitmap com a própria variável de retorno, Result;
* Com BitBlt, transferimos os blocos de bits de um retangulo para outro dispositivo;
* E finalmente, ReleaseDC que libera um dispositivo de contexto.
******************************************************
Para Converter
Function TForm1.ConverteJpeg: String;
Var
Jpeg: TJepImage;
Stream:TMemoryStream;
Begin
Try
JPeg:=TJpegImage.Create;
With Jpeg Do
Begin
{True = P&B}
Grayscale:=False;
{Qualidade em 85¬}
CompressionQuality:=85;
{Pega BMP de retorno da Função}
Assign (BitMap);
Compress;
End;
Stream:=TMemoryStream.Create;
JPeg.SaveToStream (Stream);
Stream.Position:=0;
Stream.SaveToFile (´C:\Tela.Jpg´);
Stream.Free;
JPeg.Free;
Result:=InfoArquivo (´C:\Tela.Jpg´);
Except
Result:=´Opá deu Merda!!!! Arquivo não Encontrado!!!!!´;
End;
End;
Análise do Código;
* Criamos um variavel do tipo TjpegImag e configuramos a propriedade Grayscale para false. Caso Grayscale esteja configurado para true, o arquivo saira em tons de conja, reduzindo a qualidade e também o tamanho do arquivo. Configuramos tbm o CompressionQuality para 85¬;
* CompressionQuality varia de 1 a 100. Quanto maior for o valor de compressionQuality, melhor qualidade terá , e maior ele será tbm;
* Com o comando assign, fazemos com que a variavel Jpeg incorpore o arquivo Bitmap para, logo depois, chamarmos a função Compress que irá realizar a conversão desse arquivo;
***********************************************************
Salvamos Jpeg Na Variavel Stream para gravar o arquivo convertido em disco. Fazemos isto, pq Jpeg não tem a função SaveToFile;
***********************************************************
Abraços, Espero ter ajudado, apesar das brincadeiras....
Iter Vinícius - Morphadron
Gostei + 0
30/06/2003
Rabitz
Capturar tela e salvar em disco é fácil...
quero ver, passar o arquivo via socket...
Eu mesmo resolvi o problema usando um segundo componente, o NMStream (acho que é assim), junto com os Sockets...
no momento não tenho a solução aqui, e está dando uns erros (mas mesmo com msgs de erro ele manda o arquivo para o Servidor)... mas a noite (ou madrugada), quando chegar em casa, eu posto aqui (se alguém entender a bagunça que eu fiz....)
Só queria mesmo é postar esta dica, a todos que querem enviar arquivos ou Stream pela rede, dá uma olhadinha nos componentes NMStream e NMStreamSVR (acho), da GUIA FastNet, e em seu DEMO que acompanha o Delphi.
Abraços aos irmãos e irmãs Delphianos
Rabitz
Gostei + 0
27/04/2009
Brenomed
Não sei se vc já conseguiu resolver, mas usei seu código e funcionou blz pura, estou com um Servidor e um Cliente onde mando capturar a tela e ele captura e envia pelo Socket. Uso Delphi 7!
Abaixo vai o trecho do que mudei no seu código:
[b:a798897bfa]procedure TfrmInicial.ClientSocketTelaDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Arquivo.free;
Image.Picture.LoadFromFile(´recebido.jpg´);
end;[/b:a798897bfa]
Nesta linha Image.Picture.LoadFromFile(´telacapturada.jpg´); eu estou usando um componente de imagem do TMS, mas pode usar o TImage sem problemas... Mas para usar tem que mudar ficaria dessa forma abaixo:
[b:a798897bfa]procedure TfrmInicial.ClientSocketTelaDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Arquivo.free;
Application.ProcessMessages;
Image1.Picture.Graphic.LoadFromFile(´recebido.jpg´);
end;[/b:a798897bfa]
//Se vc for no diretorio da aplicação verá que tem esse arquivo salvo, logo então posso abrir como um arquivo usando o [b:a798897bfa]LoadFromFile[/b:a798897bfa].
Vc me ajudou muito com sua dica, e definitivamente resolveu o meu problema... Muito obrigado mesmo, e espero ter ajudado.
Grande Abraço a Todos! Até a Proxima.
end;
Gostei + 0
17/09/2022
Paulo
já tenho a função para anexar a imagem, agora falta enviar via socket.
Gostei + 0
18/09/2022
Claudio Andrade
já tenho a função para anexar a imagem, agora falta enviar via socket.
Fala Paulo, tudo joia?
Segue uma sugestão de função para converter a imagem para base64 e dai você faz o envio, o cliente faz o processo inverso do outro lado, convertendo de base64 para imagem e todos ficam felizes. (:
https://flixengineering.com/archives/961
Espero ter ajudado!
Abraço.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)