ورود

View Full Version : سوال: ذخیره تصویر به صورت مستقیم در حافظه و ارسال در شبکه



Mask
سه شنبه 30 آذر 1389, 19:50 عصر
با سلام
سوالم اینه که چطوری میتونم وقتی از صفحه دسکتاپ عکس میگیرم بدونه اینکه در فایلی ذخیره کنم به صورت مستقیم بفرستم بر روی یه سیستم دیگه تو شبکه.
ممنون.

vcldeveloper
چهارشنبه 01 دی 1389, 00:57 صبح
لزومی نداره که اون رو در فایل ذخیره کنید. مشخص کنید که با چه روشی عکس گرفتید، به چه شکلی ذخیره کردید، و به چه شکلی اون رو ارسال کردید، تا بشه گفت کجا را اشتباه انجام دادید و باید تغییر بدید.

Mask
پنج شنبه 02 دی 1389, 10:23 صبح
procedure BMPtoJPGStream(const Bitmap : TBitmap; var AStream: TMemoryStream);
var
JpegImg: TJpegImage;
begin
JpegImg := TJpegImage.Create;
try
// JpegImg.CompressionQuality := 50;
JpegImg.PixelFormat := jf8Bit;
JpegImg.Assign(Bitmap);
JpegImg.SaveToStream(AStream);
finally
JpegImg.Free
end;
end; (* BMPtoJPG *)


procedure TMainFormClient.TimerTimer(Sender: TObject);
var
JpegStream : TMemoryStream;
pic : TBitmap;
sCommand : string;
begin
if not TCPClient.Connected then Exit;

Timer.Enabled := False;

TCPClient.WriteLn('CheckMe'); //command handler
sCommand := TCPClient.ReadLn;
if sCommand = 'TakeShot' then
begin
pic := TBitmap.Create;
JpegStream := TMemoryStream.Create;
ScreenShot(0,0,Screen.Width,Screen.Height,pic);
BMPtoJPGStream(pic, JpegStream);
pic.FreeImage;
FreeAndNil(pic);

// copy file stream to write stream
TCPClient.WriteInteger(JpegStream.Size);
TCPClient.OpenWriteBuffer;
TCPClient.WriteStream(JpegStream);
TCPClient.CloseWriteBuffer;
FreeAndNil(JpegStream);

//making sure!
TCPClient.ReadLn;
end;

Timer.Enabled := True;
end;

procedure TMainFormClient.ScreenShot(x : integer; y : integer; Width : integer; Height : integer; bm : TBitMap);
var
dc: HDC; lpPal : PLOGPALETTE;
begin
{test width and height}
if ((Width = 0) OR (Height = 0)) then exit;
bm.Width := Width;
bm.Height := Height;
{get the screen dc}
dc := GetDc(0);
if (dc = 0) then exit;
{do we have a palette device?}
if (GetDeviceCaps(dc, RASTERCAPS) AND RC_PALETTE = RC_PALETTE) then
begin
{allocate memory for a logical palette}
GetMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
{zero it out to be neat}
FillChar(lpPal^, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)), #0);
{fill in the palette version}
lpPal^.palVersion := $300;
{grab the system palette entries}
lpPal^.palNumEntries :=GetSystemPaletteEntries(dc,0,256,lpPal^.palPalEn try);
if (lpPal^.PalNumEntries <> 0) then
begin
{create the palette}
bm.Palette := CreatePalette(lpPal^);
end;
FreeMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
end;
{copy from the screen to the bitmap}
BitBlt(bm.Canvas.Handle,0,0,Width,Height,Dc,x,y,SR CCOPY);
{release the screen dc}
ReleaseDc(0, dc);
end; (* ScreenShot *)

Felony
شنبه 04 دی 1389, 19:06 عصر
میتونید از کلاس TWinSocketStream کتابخانه ScktComp استفاده کنید .