{"id":137,"date":"2007-05-12T15:00:54","date_gmt":"2007-05-12T13:00:54","guid":{"rendered":" http:\/\/www.nsonic.de\/blog\/2007\/05\/streaming-jpeg\/"},"modified":"2007-05-12T15:00:55","modified_gmt":"2007-05-12T13:00:55","slug":"streaming-jpeg","status":"publish","type":"post","link":"https:\/\/www.nsonic.de\/blog\/2007\/05\/streaming-jpeg\/","title":{"rendered":"Streaming JPEG"},"content":{"rendered":"<p>(Stream Jpeg Jpg LoadFromStream SaveToStream)<\/p>\n<p>The same problem is with TIcon, for example.<br \/>\nHere is a workaround (not very efficient, but it works)<br \/>\nI save size of image binary data before data itself. When loading, I load<br \/>\ndata for one image in separate stream, and than load image from this stream.<br \/>\nThis method solves two problems:<br \/>\n(1) incorrect stream position after loading some graphics formats;<br \/>\n(2) reading of empty images (empty bitmap saves nothing)<br \/>\n<!--more--><br \/>\n[code lang=&#8221;delphi&#8221;]procedure SavePicture(Stream: TStream; gr: TGraphic);<br \/>\nvar p, newp: Integer;<br \/>\nbegin<br \/>\n  p := Stream.Position;<br \/>\n  Stream.WriteBuffer(p, SizeOf(p));<br \/>\n  gr.SaveToStream(Stream);<br \/>\n  newp := Stream.Position;<br \/>\n  Stream.Position := p;<br \/>\n  p := newp &#8211; p &#8211; SizeOf(p);<br \/>\n  Stream.WriteBuffer(p, SizeOf(p));<br \/>\n  Stream.Position := newp;<br \/>\nend;<\/p>\n<p>procedure LoadPicture(Stream: TStream; gr: TGraphic);<br \/>\nvar MemStream: TMemoryStream;<br \/>\n     v: Integer;<br \/>\nbegin<br \/>\n  MemStream  := TMemoryStream.Create;<br \/>\n  try<br \/>\n    Stream.ReadBuffer(v, sizeof(v));<br \/>\n    MemStream.SetSize(v);<br \/>\n    Stream.ReadBuffer((MemStream.Memory)^, v);<br \/>\n    MemStream.Position := 0;<br \/>\n    gr.LoadFromStream(MemStream);<br \/>\n  finally<br \/>\n    MemStream.Free;<br \/>\n  end;<br \/>\nend;<br \/>\n[\/code]<br \/>\n(I&#8217;ve made some changes in code when wrote this letter, so typing errors are<br \/>\npossible)<\/p>\n<p>[tags]Delphi, Graphic[\/tags]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>(Stream Jpeg Jpg LoadFromStream SaveToStream) The same problem is with TIcon, for example. Here is a workaround (not very efficient, but it works)&hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":""},"categories":[11],"tags":[75,101],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p71Tml-2d","_links":{"self":[{"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/posts\/137"}],"collection":[{"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/comments?post=137"}],"version-history":[{"count":0,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/posts\/137\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/media?parent=137"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/categories?post=137"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/tags?post=137"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}