Working with streams
You can use Marblecore to
load and
save image files directly from (and to) disk. You can even use the
LoadFromURL method to load an image directly from an URL (which is very convienent as much of the content nowadays resides online). But often you want to keep your images in memory. For example if you use the library within a defined process or when you want to stream an image back to a client (like through a webserver to a browser). Therefore the library contains stream functionality so you can load images from streams and save images back to streams.
Besides normal streams the library also contains a special internal stream format called serialized streams. These serialized streams are used for a different purpose: Transferring images between (or within) Marblecore Imaging objects. You can use these serialized streams when you want to insert (a part of) an image into another image or when working with different layers where each layer is represented by a Marblecore image object. The main difference is a big speed advantage. Normal streams are a exact representation of the contents of a formatted image file (like a JPEG, PNG or GIF file). When you load an image from a normal stream, the image is opened and decoded to a Marblecore image object for further processing. When you save an image back to a stream, the library encodes the image object to a stream with the desired image format. This encoding and decoding is overhead and unnecessary when you just want to transfer bitmap data (read image pixels). This page explains when to use normal streams and when to use the serialized stream solution.
Using normal streams
Use normal streams to load images from memory or to save images in the desired format back to a stream. The image stream in memory can be written directly to a file to create a physic copy of the image. All normal stream methods are suffixed with 'Stream' (instead of 'SerializedStream'). Below is an example how to use the
SaveToStream method to deliver a PNG image through a webserver (using classic ASP and VBScript):
1 <%@ Language=VBScript @ENABLESESSIONSTATE=FALSE %>
2 <%
3
4 Dim Image
5
6
7 Set Image = Server.CreateObject("Marblecore.Imaging")
8
9
10 Image.Create 200, 200
11
12
13 Image.DrawRectangleFilled 0, 0, 200, 200, Image.GetColorFromHTML("#ff0000")
14
15
16 Response.ContentType = Image.GetMIMEFromFormat("PNG")
17 Response.BinaryWrite Image.SaveToStream("PNG")
18
19 %>
The following methods are available for working with normal streams:
LoadFromStream |
SaveToStream |
InsertFromStream |
SaveHistogramToStream |
LoadHistogramFromStream |
FilterTextureFromStream |
MaskOverlayFromStream
Using serialized streams
Use serialized streams if you want to transfer images between or within Marblecore image objects. It is a very fast method for transferring image pixels and gives much better perfomance than using normal streams. Use the serialized methods only for transferring data between or within Marblecore image objects. All serialized stream methods are suffixed with 'SerializedStream'. Below is an example how to create two separate images and blend them together using the
Serialize and
InsertFromSerializedStream methods:
1
2 Imaging1.Create(200, 200);
3 Imaging1.DrawRectangleFilled(0, 0, 200, 200, Imaging1.GetColorFromHTML("#ff0000"));
4
5
6 Imaging2.Create(100, 100);
7 Imaging2.DrawEllipseFilled(0, 0, 100, 100, Imaging2.GetColorFromHTML("#0000ff"));
8
9
10 Imaging1.InsertFromSerializedStream(Imaging2.Serialize(), 50, 50, 75);
The following methods are available for working with serialized streams:
Serialize |
Deserialize |
LoadFromSerializedStream |
InsertFromSerializedStream |
SaveHistogramToSerializedStream |
LoadHistogramFromSerializedStream |
FilterTextureFromSerializedStream |
MaskOverlayFromSerializedStream