PDA

View Full Version : انتقال یک jpg با استفاده از stream



delphi77
چهارشنبه 12 بهمن 1384, 19:00 عصر
چطور می توانم یک فایل جی پی جی را با استریم منتقل کنم؟

Touska
چهارشنبه 12 بهمن 1384, 19:02 عصر
منتقل از کجا به کجا ؟

koosha system
چهارشنبه 12 بهمن 1384, 19:12 عصر
دوست من سوال (بالا ذکر شد) کامل نیست.
با Stream می شه هر نوع اطلاعاتی رو ...
چه شبکه و چه داخلی

vcldeveloper
پنج شنبه 13 بهمن 1384, 08:51 صبح
اگر یکبار کلمه Stream یا JPEG را در بخش دلفی جستجو می کردید، تا حالا به جواب رسیده بودید!

delphi77
شنبه 15 بهمن 1384, 16:48 عصر
1- من ابتدا یک bmp می خوانم
2- بعد آن را jpg تبدیل می کنم
3- بعد آن را با stream به sucket مربوطه در کامپیوتر دیگر می فرستم
4- بعد در ان کامپیوتر می گیرمش و در یک timage قرار می دهم که متاسفانه عکس را نشان نمی ده

Touska
شنبه 15 بهمن 1384, 17:20 عصر
شما سایز Stream ی را که در آنور می گیرید چک کنید که source یکی است.

و سپس jpg را در Graphic نشان دهید.

delphi77
دوشنبه 17 بهمن 1384, 15:50 عصر
به دلیل اینکه از کامپوننت tcpserver-client استفاده می کنم نمی دانم که receivelength را چطور بدست بیارم اگر می دانید لطفا راهنمایی بفرمایید

Touska
دوشنبه 17 بهمن 1384, 21:23 عصر
اگر شما Recive ی داشته باشید و بتونید آنها را در یک Stream ریخته و با تابع Sizeof می تونید

سایز آن را بگیرید.

Naficy
سه شنبه 18 بهمن 1384, 11:11 صبح
مجبورید سایز را خودتان ارسال کنید. (قاعدتا قبل از ارسال استریم) نمی توانید از تابعی استفاده کنید.

delphi77
سه شنبه 18 بهمن 1384, 15:08 عصر
من کد دریافتم به این شکله..


var
Stream : TMemoryStream;
Buffer : ^TStream;
i : integer;
begin

Stream := TMemoryStream.Create;
Buffer:=nil;
GetMem(Buffer, BufferSize);
i:=ClientSocket.ReceiveBuf(Buffer^,BufferSize);
Stream.WriteBuffer(Buffer^, i);
FreeMem(Buffer,i);
while i<>0 do
begin
try
GetMem(Buffer, BufferSize);
i:=ClientSocket.ReceiveBuf(Buffer^,BufferSize);
Stream.WriteBuffer(Buffer^, i);
finally
FreeMem(Buffer);
end;
end;
Stream.Seek(0, soFromBeginning);

ImgClientMonitor.Picture.Bitmap.LoadFromStream(Str eam);
end;

MiRHaDi
چهارشنبه 19 بهمن 1384, 07:10 صبح
سلام
ImgClientMonitor.Picture.Bitmap.LoadFromStream(Str eam);
شما اگه LoadFromFile بزنی در این حالت و Jpg بدی مگه میخونه که حالا با Stream بخونه !؟
بای

delphi77
پنج شنبه 20 بهمن 1384, 01:45 صبح
من متوجه منظور شما نشدم!
من همینطوری bitmap را می فرستم

Naficy
پنج شنبه 20 بهمن 1384, 13:00 عصر
1 - همانطور که گفتم قبل از ارسال stream، سایز آنرا بفرستید. با استفاده از recievebuf و امثال آن نمی توانید سایز stream را چک کنید.
2 - نیازی نیست متغیرBuffer را مرتبا GetMem و FreeMem کنید. یکبار همان اول GetMem بزنید و یکبار هم آخر کار FreeMem را صدا بزنید.

delphi77
پنج شنبه 20 بهمن 1384, 19:18 عصر
2 - نیازی نیست متغیرBuffer را مرتبا GetMem و FreeMem کنید. یکبار همان اول GetMem بزنید و یکبار هم آخر کار FreeMem را صدا بزنید.

منظورت اینکه همین مسئله مشکل ساز شده
اصلا نحوه دریافت stream که من استفاده می کنم درسته

Naficy
جمعه 21 بهمن 1384, 21:40 عصر
خیر. این کار شما فقط سرعت را کاهش می دهد.
برای سومین بار دارم می گم، درست قبل از ارسال stream، سایز آنرا برای کلاینت بفرستید. شما خسته نمی شوید اینقدر من یک حرف رو تکرار می کنم؟

MiRHaDi
دوشنبه 24 بهمن 1384, 11:21 صبح
سلام
عزیزم اشاره کردم بهت که !
Jpeg با Bitmap فرق داره ! اشتباهه کد شما !
فایلش رو هم نمیشه اینجوری باز کرد ! ربطی به Stream نداره
بای

delphi77
دوشنبه 24 بهمن 1384, 14:43 عصر
من به این شکل سایز را فرستادم


TcpClient1.Sendln(IntToStr(StreamLength));
TcpClient1.SendStream(TheStream);


متاسفانه نتوانستم مشکل را حل کنم



Jpeg با Bitmap فرق داره ! اشتباهه کد شما !
فایلش رو هم نمیشه اینجوری باز کرد ! ربطی به Stream نداره

اقای MiRHaDi
درستش چیه؟

delphi77
پنج شنبه 27 بهمن 1384, 11:32 صبح
ایا مجبورم فایل را قبلا روی هارد save کنم

delphi77
جمعه 28 بهمن 1384, 18:00 عصر
در این صورت با مواردی که فایل حجمش زایاده چه باید کرد

Naficy
شنبه 29 بهمن 1384, 13:49 عصر
می بخشید که دیر جواب می دم. دفعه قبل اینترنتم تمام شد...
1 - اول مشخص کنید که bmp را می فرستید یا jpeg را. (کد send تون را بنویسید). این به خاطر آقای میرهادی.
2 - از چه کامپوننتی برای ارسال و دریافت استفاده می کنید؟
3 - نه. منظور من از ارسال سایز این نبود. اما فعلا منظورمو نمی گم تا ار این دو مورد قبلی، مطلع بشم.

delphi77
شنبه 29 بهمن 1384, 14:44 عصر
1 - اول مشخص کنید که bmp را می فرستید یا jpeg را.

jpg


2 - از چه کامپوننتی برای ارسال و دریافت استفاده می کنید؟

tcpserver & tcpclient


(کد send تون را بنویسید).

اگر ممکنه صبر کنید بزوردی می فرستمش

delphi77
یک شنبه 30 بهمن 1384, 19:29 عصر
var
screenDC :HDC;
tmpRect :TRect;
TmpBitmap :TBitmap;
jpgtmp :TJPEGImage;
Stm :TMemoryStream;
begin
screenDC :=GetDC(0);
TmpBitmap:=TBitmap.Create;
jpgtmp :=TJPEGImage.Create;
tmpRect :=Rect(0,0,Screen.Width,Screen.Height);
TmpBitmap.Width:=tmpRect.Right-tmpRect.Left;
TmpBitmap.Height:=tmpRect.Bottom-tmpRect.Top;
// TmpBitmap.HandleType := bmDDB;
// TmpBitmap.PixelFormat := pf15bit;
try
//1) Creat bitmap screen desktop;
BitBlt(TmpBitmap.Canvas.Handle,tmpRect.Left,tmpRec t.Top,TmpBitmap.Width,TmpBitmap.Height,screenDC,tm pRect.Left,tmpRect.Top,SRCCOPY);
//2) Convert bitmap to jpg;
jpgtmp.Assign(TmpBitmap);
jpgtmp.CompressionQuality:=80;
//3) Copy jpg to stream;
Stm := TMemoryStream.Create;
jpgtmp.SaveToStream(Stm);
//4) Send stream to sucket;
SendStream(Stm);
finally
TmpBitmap.Free;
jpgtmp.Free;
Stm.Free;
ReleaseDC(0,screenDC);
end;
// veil;
end;

Naficy
سه شنبه 02 اسفند 1384, 16:54 عصر
خوب؛ مثل اینکه متاسفانه من اشتباها تصور می کردم شما از کامپوننت دیگری استفاده می کنید...

ظاهرا مشکل اصلی شما (یا یکی از اصلی ترین مشکلات شما!) همونه که آقای میرهادی می گفتند. شما دارید jpg را ارسال می کنید و بعد می خواهید آنرا با TBitmap بخوانید؟!!!
به جای کد ImgClientMonitor.Picture.Bitmap.LoadFromStream(Str eam); از کد Jpeg.LoadFromStream(Stream); استفاده کنید، که در آن Jpeg یک شی ساخته شده از کلاس TJpegImage باشد.
بدنیست یه سری به این لینک بزنین. کاری رو ظاهرا شما قصد انجامش رو دارین، انجام داده:
http://delphi.about.com/od/internetintranet/l/aa012004b.htm

delphi77
پنج شنبه 04 اسفند 1384, 11:50 صبح
بدنیست یه سری به این لینک بزنین. کاری رو ظاهرا شما قصد انجامش رو دارین، انجام داده:
http://delphi.about.com/od/interneti.../aa012004b.htm

ولی در این روش فایل saveمی شه و بعد ارسال می شه

delphi77
سه شنبه 09 اسفند 1384, 18:42 عصر
ممکنه یک کد ساده برای ارسال jpg بنویسید

Naficy
پنج شنبه 11 اسفند 1384, 11:11 صبح
ممکنه شما هم مشخص کنید که اصلا به سایر مواردی که گفتم توجه کرده اید یا نه؟