 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
SrJeff Aprendiz

Registrado: Sexta-Feira, 8 de Janeiro de 2010 Mensagens: 289
|
Enviada: Qua Mai 22, 2013 7:08 pm Assunto: Thread error |
|
|
boa noite companheiros.
Para resolver uns problemas de velocidade em minha aplicação resolvi colocar alguns códigos em uma thread, mas após isso começou a ocorrer um problema: 'espaço insuficiente para processar este comando', toda hora ocorre esse erro especificamente quando faço o uso desta procedure:
| Código: |
procedure Redimensionar(Imagen:TBitmap; Ancho, Alto: Integer);
var
Bitmap: TBitmap;
//····························································
// Procedimiento de Antialiasing con Distancia=1
procedure Antialiasing(bmp1, bmp2:TBitmap);
var
r1,g1,b1:Integer;
Y, X, j:integer;
SL1, SL2, SL3: PRGBTripleArray;
begin
// Tamaño del bitmap destino
bmp2.Height := bmp1.Height;
bmp2.Width := bmp1.Width;
// SCANLINE
SL1 := bmp1.ScanLine[0];
SL2 := bmp1.ScanLine[1];
SL3 := bmp1.ScanLine[2];
// reorrido para todos los pixels
for Y := 1 to (bmp1.Height - 2) do begin
for X := 1 to (bmp1.Width - 2) do begin
R1 := 0; G1 := 0; B1 := 0;
// los 9 pixels a tener en cuenta
for j := -1 to 1 do begin
// FIla anterior
R1 := R1 + SL1[X+j].rgbtRed + SL2[X+j].rgbtRed + SL3[X+j].rgbtRed;
G1 := G1 + SL1[X+j].rgbtGreen + SL2[X+j].rgbtGreen + SL3[X+j].rgbtGreen;
B1 := B1 + SL1[X+j].rgbtBlue + SL2[X+j].rgbtBlue + SL3[X+j].rgbtBlue;
end;
// Nuevo color
R1:=Round(R1 div 9);
G1:=Round(G1 div 9);
B1:=Round(B1 div 9);
// Asignar el nuevo
bmp2.Canvas.Pixels[X, Y] := RGB(R1,G1,B1);
end;
// Siguientes...
SL1 := SL2;
SL2 := SL3;
SL3 := bmp1.ScanLine[Y+1];
end;
end;
//····························································
begin
Bitmap:= TBitmap.Create;
// Aplicamos antialiasing
Antialiasing(Imagen, Bitmap);
Imagen.Assign(Bitmap);
// reducir
try
Bitmap.Width:= Ancho;
Bitmap.Height:= Alto;
Bitmap.Canvas.StretchDraw(Bitmap.Canvas.ClipRect, Imagen);
Imagen.Assign(Bitmap);
finally
Bitmap.Free;
end;
end;
// -------------------------------------------------------------------------
|
quando uso está procedure dentro da thread ocorre o erro, mas o interessante é que nem sempre o erro ocorre, tem momentos que funciona perfeito, mas na maioria das vezes da o erro mencionado. |
|
| Voltar ao Topo |
|
 |
cyberdisk Colaborador

Registrado: Domingo, 4 de Julho de 2010 Mensagens: 2391 Localização: São José dos Campos - SP
|
Enviada: Qua Mai 22, 2013 7:54 pm Assunto: |
|
|
converta o bitmap em jpg e depois faça a sincronização na thread com o componente image
abraço _________________ O conhecimento abre muitas portas |
|
| Voltar ao Topo |
|
 |
SrJeff Aprendiz

Registrado: Sexta-Feira, 8 de Janeiro de 2010 Mensagens: 289
|
Enviada: Qua Mai 22, 2013 11:51 pm Assunto: |
|
|
Onde exatamente devo converter para jpg?
uso da seguinte forma:
| Código: |
Redimensionar(thumbnail,FormRemoteDesktop.Image.Width , FormRemoteDesktop.Image.Height);
|
assim eu redimensiono o thumbnail para o tamanho do componente image, mas é ai que dá erro.
o funcionamento é + ou - assim:
*Recebo a imagem no formato stream do cliente, passo para uma variavel jpeg e depois converto para bitmap, faço o redimensionamento e por fim mostro a imagem no componente image.
Segue o código para receber e converter a imagem:
| Código: |
var Jpg:TJpegImage;
T : string;
thumbnail : TBitmap;
begin
Try
tempo := 0;
T:=Socket.ReceiveText;
if not Receiving then
begin
if pos(#0,T) > 0 then
StreamSize := strtoint(copy(T,1,pos(#0,T)-1))
else exit;
Stream := TMemoryStream.Create;
Receiving:=True;
delete(T,1,pos(#0,T));
FormRemoteDesktop.ProgressBar1.MaxValue := StreamSize;
end else
begin
try
Stream.Write(T[1],length(T));
FormRemoteDesktop.ProgressBar1.Progress := Stream.Size;
if Stream.Size = StreamSize then
begin
Stream.Position:=0;
jpg:=TJPEGImage.Create;
jpg.LoadFromStream(Stream);
FreeAndNil(Stream);
thumbnail := TBitmap.Create;
// --------------------------
if FormRemoteDesktop.B_Full_Screen.Flat = true then begin
thumbnail.PixelFormat := pf32bit;
thumbnail.Assign(jpg);
Redimensionar(thumbnail,FormRemoteDesktop.Image.Width , FormRemoteDesktop.Image.Height);
jpg:=TJPEGImage.Create;
jpg.Assign(thumbnail);
FormRemoteDesktop.Image.Picture.Assign(thumbnail);
end else
begin
//sleep(100);
FormRemoteDesktop.Image.Picture.Assign(jpg);
end;
jpg.Free;
Receiving:=False;
t := '';
thumbnail.Free;
end;
except
FreeAndNil(Stream);
FreeAndNil(thumbnail);
FreeAndNil(jpg);
end;
// .............
end;
except
end;
end;
|
|
|
| Voltar ao Topo |
|
 |
cyberdisk Colaborador

Registrado: Domingo, 4 de Julho de 2010 Mensagens: 2391 Localização: São José dos Campos - SP
|
Enviada: Qui Mai 23, 2013 10:49 pm Assunto: |
|
|
| Código: | | FormRemoteDesktop.ProgressBar1.Progress := Stream.Size; |
veja que voce esta usando um componente ProgressBar1 dentro da thread
a função da thread é executar um código demorado em segundo plano, entretanto voce deve sincronizar o componente ProgressBar1 para não causar erro
veja esse post
http://www.activedelphi.com.br/forum/viewtopic.php?p=243894
abraço _________________ O conhecimento abre muitas portas |
|
| Voltar ao Topo |
|
 |
SrJeff Aprendiz

Registrado: Sexta-Feira, 8 de Janeiro de 2010 Mensagens: 289
|
Enviada: Sex Mai 24, 2013 2:26 pm Assunto: |
|
|
| já coloquei em Synchronize e ainda está dando erro, exatamente na linha que falei.... tá dando dor de cabeça já. |
|
| Voltar ao Topo |
|
 |
cyberdisk Colaborador

Registrado: Domingo, 4 de Julho de 2010 Mensagens: 2391 Localização: São José dos Campos - SP
|
Enviada: Sáb Mai 25, 2013 10:11 pm Assunto: |
|
|
experimente
Converter BMP para JPEG
Coloque na cláusula uses do seu Form a unit Jpeg
| Código: | procedure BmpToJpg(FileName: string);
var
Jpg: TJpegImage;
Stm: TMemoryStream;
Bmp: TBitmap;
begin
if FileExists(FileName) then begin
Bmp := TBitmap.Create;
Bmp.LoadFromFile(FileName);
Jpg := TJpegImage.Create;
Jpg.Assign(Bmp);
Jpg.Compress;
Stm := TMemoryStream.Create;
Jpg.SaveToStream(Stm);
Stm.Position := 0;
Stm.SaveToFile(ChangeFileExt(FileName, '.jpg'));
Stm.Free;
Jpg.Free;
Bmp.Free;
end;
end; |
O uso deste procedimento pode ser assim:
| Código: | procedure TForm1.Button1Click(Sender: TObject);
begin
// após a conversão será criado o arquivo Figura.jpg no mesmo diretório
BmpToJpg('C:\Temp\Figura.bmp');
end; |
abraço _________________ O conhecimento abre muitas portas |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|