ThinkGeo.com    |     Documentation    |     Premium Support

Printing/Saving as Image

 Hi, 


I have Silverlight application and I add the layers on client side, now I want to print or save as image my Silverlight control content.


1- I tried to usage PrinterInteractiveOverLay, but seems Silverlight does not support it ( I cannot find PrinterInteractiveOverLay : 184.73.226.83/wiki/ThinkGeo....ghtEdition )


2-This link speaks about server side printing, but I want to do the things on client ( I didn't use  ServerLayerOverlay to add layers ).


I will be grateful if you help me to print map or save it as image.


In addition, I want to shows overlays as legend, do you have any sample about it.


 


Regards,


Ben



Hello Ben, 



I'm sorry, because there is a very important internal class named AdornmentInteractiveOverlay for PrinterInteractiveOverLay, it only supported by DesktopEdition and WpfEdition right now, so we can't run PrinterInteractiveOverLay in WebEdition and SilverlightEdition, but there is a chance we will add it into webedtion at next release.  



You can have a look at this post, I think it can help you to make the print: 

http://community.thinkgeo.com/t/pdf-extension/6856

And here is another sample that can show you how to use legend, I hope it can help. 

wiki.thinkgeo.com/wiki/Map_Suite_Si...w_A_Legend

If you meet any questions, please let us know. 



Regards, 



Gary



 Hi Gary,


Many thanks for your answer.



        
  1. I attache the screen shot of map plus the printed version, as you can see the printed version just show the left part of map

  2.     
  3. I prefer to save the visiable part of map as image, so, I create a writeableBitmap from control:

        WriteableBitmap bitmap = new WriteableBitmap(MapControl, null); 
     and then pass it to below method to save it as Image:       public static void SaveToFile(WriteableBitmap bitmap, Stream fs)
            {
                int width = bitmap.PixelWidth;
                int height = bitmap.PixelHeight;
                int bands = 3;
                byte[][,] raster = new byte[bands][,];

                for (int i = 0; i < bands; i++)
                {
                    raster<i> = new byte[width, height];
                }

                for (int row = 0; row < height; row++)
                {
                    for (int column = 0; column < width; column++)
                    {
                        int pixel = bitmap.Pixels[width * row + column];
                        raster[0][column, row] = (byte)(pixel >> 16);
                        raster[1][column, row] = (byte)(pixel >> 8);
                        raster[2][column, row] = (byte)pixel;
                    }
                }

                ColorModel model = new ColorModel { colorspace = ColorSpace.RGB };
                FluxJpeg.Core.Image img = new FluxJpeg.Core.Image(model, raster);

                //Encode the Image as a JPEG
                MemoryStream stream = new MemoryStream();
                FluxJpeg.Core.Encoder.JpegEncoder encoder = new FluxJpeg.Core.Encoder.JpegEncoder(img, 100, stream);
                encoder.Encode();

                //Back to the start
                stream.Seek(0, SeekOrigin.Begin);

                //Get teh Bytes and write them to the stream
                byte[] binaryData = new Byte[stream.Length];
                long bytesRead = stream.Read(binaryData, 0, (int)stream.Length);
                fs.Write(binaryData, 0, binaryData.Length);
            }


the above code is working for all silverlight controls, but when I pass mapcontrol, I received below error:


"WriteableBitmap has protected content. Pixel access is not allowed."


can you please help me to solve this problem, orshow me another way to save control as image.


 


Best Wishes,


Ben



PrintedMap.PNG (20.3 KB)
RealMap.PNG (43 KB)

Hello Ben, 



This problem is caused by the WriteableBitmap security problem in Silverlight, you can get some help from the link below: 


http://community.thinkgeo.com/t/custom-featurelayer-asynchron-sever-call-in-silverlight/6897




Or you can change to other type of image. 



Regards, 



Gary



the image types are very important when you are saving images in c#. besides choose the right internal class in this situation. new to silvelight, more descriptions would be helpful. and i was wondering what is the difference with other .net image sdk.

Hi FWE, 
  
 Welcome to MapSuite world! Thanks for your link information in “saving images in c#”, the internal class named AdornmentInteractiveOverlay for PrinterInteractiveOverLay, it only supported by DesktopEdition and WpfEdition right now, so we can’t run PrinterInteractiveOverLay in WebEdition and SilverlightEdition. but we could use the sample in thinkgeo.com/forums/MapSuite/tabid/143/aft/7508/Default.aspx#19662 to walkaround. 
  
 Best Regards 
  
 Summer


Posted By Gary on 10-26-2011 02:49 AM


Hello Ben, 



This problem is caused by the WriteableBitmap security problem in Silverlight, you can get some help from the link below: 


http://community.thinkgeo.com/t/custom-featurelayer-asynchron-sever-call-in-silverlight/6897



Or you can change to other type of image



Regards, 



Gary


Instead of Jpeg image type, what are the other supportive image formats, Png, Bmp, Gif?

Hi Susanna, 
  
 It looks Gary mentioned if possible Ben can choose another format but not use WriteableBitmap. 
  
 Have you met the same exception when you use Jpeg Image in silverlight? 
  
 Regards, 
  
 Don