各位能者,请问一下:
我想做一个界面能用互联网传送图片,结果出现了如标题的情况,
图片是传送成功了,但图像变样了,颜色变得乱七八槽了,我猜原因是因为接收的流会比发送的流大的原故,但不知道怎么办,请各位帮我解惑一下。
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
SendSize:integer;
Buf:array[0..10000] of byte;
s,l,ii:string;
begin
//memo1.Lines.Text:=clientsocket1.Socket.ReceiveText;
s:=socket.ReceiveText;
if (s='ok') then clientsocket1.Socket.SendText(inttostr(myStream.Size));
if (s='data') then clientsocket1.Socket.SendStream(myStream);
if (s='over') then label2.Caption:='图像接收完毕';
end;
if(size1<>0) and (go1=true) then
begin
myStream2:=TMemoryStream.Create;
repeat
//myStream:=TMemoryStream.Create;
len:=socket.ReceiveLength;
label2.Caption :='ÒѽÓÊÕ:'+inttostr(len);
socket.ReceiveBuf(buffer,len);
myStream2.write(buffer,len);
// myStream.Seek(0,soFromBeginning);
//myStream2.Seek(0,soFromEnd);
// myStream2.CopyFrom(myStream,0);
//myStream.free;
until myStream2.Size>=size1;
socket.SendText('over');
edit1.Text:='dx:'+inttostr(myStream2.Size);
end;
结果接收的流会比发送的流大?
我想做一个界面能用互联网传送图片,结果出现了如标题的情况,
图片是传送成功了,但图像变样了,颜色变得乱七八槽了,我猜原因是因为接收的流会比发送的流大的原故,但不知道怎么办,请各位帮我解惑一下。
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
SendSize:integer;
Buf:array[0..10000] of byte;
s,l,ii:string;
begin
//memo1.Lines.Text:=clientsocket1.Socket.ReceiveText;
s:=socket.ReceiveText;
if (s='ok') then clientsocket1.Socket.SendText(inttostr(myStream.Size));
if (s='data') then clientsocket1.Socket.SendStream(myStream);
if (s='over') then label2.Caption:='图像接收完毕';
end;
if(size1<>0) and (go1=true) then
begin
myStream2:=TMemoryStream.Create;
repeat
//myStream:=TMemoryStream.Create;
len:=socket.ReceiveLength;
label2.Caption :='ÒѽÓÊÕ:'+inttostr(len);
socket.ReceiveBuf(buffer,len);
myStream2.write(buffer,len);
// myStream.Seek(0,soFromBeginning);
//myStream2.Seek(0,soFromEnd);
// myStream2.CopyFrom(myStream,0);
//myStream.free;
until myStream2.Size>=size1;
socket.SendText('over');
edit1.Text:='dx:'+inttostr(myStream2.Size);
end;
结果接收的流会比发送的流大?
var
hr: HRESULT;
BIHeaderPtr: PBitmapInfoHeader;
MediaType: TAMMediaType;
BitMapHandle: HBitmap;
DIBPtr: Pointer;
jpg: TJpegImage;
memStream: TMemoryStream;
begin
Image.Canvas.Lock;
try
hr := Grabber.SampleGrabber.GetConnectedMediaType(MediaType);
if hr <> S_OK then
Exit;
try
if IsEqualGUID(MediaType.majortype, MEDIATYPE_Video) then
begin
BIHeaderPtr := nil;
if IsEqualGUID(MediaType.formattype, FORMAT_VideoInfo) then
if MediaType.cbFormat = SizeOf(TVideoInfoHeader) then
BIHeaderPtr := @(PVideoInfoHeader(MediaType.pbFormat)^.bmiHeader);
if not Assigned(BIHeaderPtr) then
Exit;
BitmapHandle := CreateDIBSection(0, PBitmapInfo(BIHeaderPtr)^, DIB_RGB_COLORS, DIBPtr, 0, 0);
if BitmapHandle <> 0 then
begin
if DIBPtr = nil then
Exit;
if BufferLen > Integer(BIHeaderPtr^.biSizeImage) then
BufferLen := BIHeaderPtr^.biSizeImage;
Move(pBuffer^, DIBPtr^, BufferLen);
Image.Picture.Bitmap.Handle := BitmapHandle;
end;
end;
finally
FreeMediaType(@MediaType);
end;
memStream := TMemoryStream.Create;
jpg := TJpegImage.Create;
jpg.Assign(Image.Picture.Bitmap);
jpg.CompressionQuality := 80;
jpg.JPEGNeeded;
jpg.Compress;
jpg.SaveToStream(memStream);
jpg.Free;
try
IdUDPServer1.SendBuffer('192.168.1.88',8581,memStream.Memory^, memStream.Size);
except
IdUDPServer1.Active := false;
IdUDPServer1.Active := true;
end;
memStream.Free;
finally
Image.Canvas.Unlock;
end;
end;接收:
procedure TServerForm.TCPServerExecute(AThread: TIdPeerThread);
var
memStream: TMemoryStream;
jpg: TJpegImage;
BufferLen: Integer;
begin
if AThread.Connection.Connected and not AThread.Terminated then
begin
memStream := TMemoryStream.Create;
BufferLen := AThread.Connection.ReadInteger;
memStream.Size := BufferLen;
AThread.Connection.ReadBuffer(memStream.Memory^, BufferLen);
jpg := TJpegImage.Create;
jpg.LoadFromStream(memStream);
Image.Picture.Bitmap.Assign(jpg);
jpg.Free;
memStream.Free;
end;
end;