Нужна помощь в отправке переменной типа TJpegImage в сокет "на лету" из памяти. вариант сохранить в файл а затем отправлять не предлагать перевожу сначала Jpeg в MemoryStream а затем стрим копирую в буфер, но уже при самом переводе из jpeg в memorystream облом какойто, размер картинки в два раза растет, а при передаче в буфер совсем ноль, может существует способ непосредственно используя переменную jpeg отправлять в сокет? PHP: procedure SendJpeg(JpegName:String); const PACKET_DATA_SIZE = 16777216;//16*1024*1024//16ÌÁ type PByteArray = ^TByteArray; TByteArray = array[0..PACKET_DATA_SIZE-1] of byte; var Buf : PByteArray; jpg : TJpegImage; MemStream : TMemoryStream; flw : File; begin jpg := TJpegImage.Create; MemStream := TMemoryStream.Create; try jpg.LoadFromFile(JpegName); try jpg.SaveToStream(MemStream); GetMem(Buf,MemStream.Size); MemStream.WriteBuffer(Buf^,MemStream.Size); SendBuf(Sock,Buf^,MemStream.Size); jpg.SaveToFile('1.jpg');//сохраняется файл размером 3 кб MemStream.SaveToFile('C:\2.jpg');//сохраняется файл размером 6 кб AssignFile(flw,'C:\3.jpg'); ReWrite(flw,1); BlockWrite(flw,buf^,MemStream.Size);//ничего не сохраняется CloseFile(flw); FreeMem(Buf); finally end; finally jpg.free; MemStream.Free; end; end;
MemStream.WriteBuffer(Buf^,MemStream.Size); - это ты запишешь буфер в поток, а тебе нужно читать его типа ReadBuffer. Воть только не забывай устанавливать позицию на начала потока MemStream.position:=0; типа так
Способ 1. Можно воспользоваться компонентами TNMStrmServ и TNMStrm. Они специально предназначены для обмена потоками данных. PHP: //Обработчик для клиента: var MyStream: TMemoryStream; Jpg: TJpegImage; begin ... //тут сами определите как у вас появляется Jpg ... MyStream := TMemoryStream.Create; Jpg.SaveToStream(MyStream); NMStrm1.PostIt(MyStream); MyStream.Free; end; //Обработчик для сервера: procedure TForm1.NMStrmServ1MSG(Sender: TComponent; const sFrom: string; strm: TStream); var MyStream: TMemoryStream; begin MyStream := TMemoryStream.Create; MyStream.CopyFrom(strm, NMStrmServ1.BytesTotal); MyStream.SaveToFile('c:\windows\1.jpg'); end; 2 Способ. рекомендую. PHP: private { Private declarations } Reciving: boolean; DataSize: integer; Data: TMemoryStream; ... ... procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin // Посылаем команду для начала передачи файла. Socket.SendText('send'); end; procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var s, sl: string; Jpg: TJpegImage; begin ... // и тут сами определите откуда у вас Jpg ... s:= Socket.ReceiveText; // Если мы не в режиме приёма: if not Reciving then begin // Теперь нам необходимо получить длину потока данных. SetLength(sl, StrLen(PChar(s))+1); // +1 for the null terminator StrLCopy(@sl[1], PChar(s), Length(sl)-1); DataSize:= StrToInt(sl); Data:= TMemoryStream.Create; // Удаляем информацию о размере из данных. Delete(s, 1, Length(sl)); Reciving:= true; end; // Сохраняем данные в файл, до тех пор, пока не получим все данные. try Data.write(s[1], length(s)); if Data.Size = DataSize then begin Data.Position:= 0; Jpg.LoadFromStream(Data); Data.Free; Reciving:= false; Socket.Close; end; except Data.Free; end; end; procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var ms: TMemoryStream; Jpg: TJpegImage; begin ... // и даже тут сами определите откуда у вас Jpg ... // Клиент получает команду на передачу файла. if Socket.ReceiveText = 'send' then begin ms:= TMemoryStream.Create; try // Получаем данные на передачу. Jpg.SaveToStream(ms); ms.Position:= 0; // Добавляем длину данных, чтобы клиент знал, // сколько данных будет передано // Добавляем #0 , чтобы можно было определить, // где заканчивается информация о размере. Socket.SendText(IntToStr(ms.Size) + #0); // Посылаем его. Socket.SendStream(ms); except // Итак, осталось освободить поток, если что-то не так. ms.Free; end; end; end; end. удачи в написании))) не забывайте передавать зашифрованные данные.
пишу без сервер/клиент сокета, использую ВинСок, поэтому не подходит вариант. Буду искать аналог юнита джипег или потрошить три-четыре модуля придется.
http://hellknights.void.ru/articles/0x48k-VisualSpy.htm Медитируй и просветлишся. З.Ы.Да, там правда автор синячит, но настоящему дельфину это перелопатить не составит труда, там голое АПИ