ThinkGeo.com    |     Documentation    |     Premium Support

Taking or saving Map's Screenshot without displaying the Map

Hi,



I have another problem again. I’ve seen example code which demonstrate on saving a screenshot of a map into BMP (and BPW) file, something like this:


1.Rectangle rDrawingMap = new Rectangle(0, 0, winformsMap1.Width, winformsMap1.Height);
2.using (bitmap = new Bitmap(rDrawingMap.Width, rDrawingMap.Height))
3.{
4.    winformsMap1.DrawToBitmap(bitmap, rDrawingMap);
5. 
6.    //Saves the bitmap for the current extent of the map.
7.    bitmap.Save(@“f:\data\mymap.bmp”);
8.}

I’ve made several function on my application, each of function when it’s called it will show map in WinformsMap (after its Refresh() is called of course) correctly according to its layer and extent, simply, they should be ready to be taken for screenshot. I plan to export that screenshots into a PDF file. To accomplish this, I plan to loop through each of those functions to take its screenshot.



Is there any way to capture (taking screenshot then save it into a file, or in memory temporary file) bitmap from LayerOverlay, or whatever it’s without showing the content first to either MapEngine or WinformsMap?



Thanks for the attention, I really appreciate it if someone can help me or give me an advice in this matter.

Hi Ariestya, 
  
 Sorry I have some confusions on your requirements. Does there is any issue with the above codes when you take its screenshot in each of functions? 
  
 Another one is "Is there any way to capture (taking screenshot then save it into a file, or in memory temporary file) bitmap from LayerOverlay"? does it mean you want to take the screenshot for each LayerOverlay rather than the whole map? 
  
 Thanks, 
 Troy

Thank you for the reply.  



I’ve coded several functions, and bind them to some radio buttons, in which if one of their CheckedChanged event is fired, a function will be run, which it will add DrawingFeatures event into a FeatureLayer (MsSql2008FeatureLayer to be exact) - to show only some certain features (or hiding others to be shown, vice versa), and also apply RegexStyle on the layer based on the checked radio button. 



Above code is working, but it requires showing the map first in the WinformsMap (or MapEngine) before the screenshot can be taken. I plan to take/grab/save image of the current LayerOverlay (which has the MsSql2008FeatureLayer altered by the function) - since it holds all other required MsSql2008FeatureLayer, into a bitmap file (or any memory object that can hold the image), without showing the map first in the WinformsMap. Is that possible?

Hi Ariestya,



Would you please try the below codes to see if it is fit for you?


            winformsMap1.OverlayDrawn += new EventHandler<OverlayDrawnWinformsMapEventArgs>(winformsMap1_OverlayDrawn);
 

 
        void winformsMap1_OverlayDrawn(object sender, OverlayDrawnWinformsMapEventArgs e)
        {
            Bitmap overlayMap = new Bitmap(winformsMap1.Width, winformsMap1.Height);
 
            GdiPlusGeoCanvas canvas = e.Canvas as GdiPlusGeoCanvas;
            canvas.BeginDrawing(overlayMap, winformsMap1.CurrentExtent, e.Canvas.MapUnit);
            e.Overlay.Draw(canvas);
            canvas.EndDrawing();
 
            overlayMap.Save("d:\"+Guid.NewGuid() +".png");
        }

Thanks,

Troy

Thank you very much for the answer. 
  
 This is exactly what I’m looking for.

Ariestya, 
  
 Good to hear it works. 
  
 Thanks, 
 Troy

EDIT: it was problem in my program.

Ariestya, 
  
 Could you please explain what’s the problem? 
  
 Thanks, 
 Troy

I tried to save the screenshots into Stream object (or MemoryStream) instead of file, but it didn’t work out properly. The images always come up empty on the pdf.



So I save the screenshots into bitmap file instead, and it works. But there is little problem. Every images that I save into a file doesn’t exactly match with the map that is shown in the WinformsMap, they’re always ended up stretch, force to fit into image dimension (not proportional). For instance, don’t worry, those images aren’t confidential).


Instead like this (I took it from WinformMaps):

  


I get this (I’ve turned off the ScaleLineAdornmentLayer and MiniMapAdornmentLayer):




As you can see, the exported image isn’t shown/scale out properly to its original ratio. I’ve tried to call DrawScreenImageWithoutScaling and DrawWorldImageWithoutScaling, filled them with their correct needed parameters, but still didn’t work. Any idea on how to fix this? Both image are using the same RectangleShape object as their CurrentExtent, same LayerOverlay object (along with its Layers), the differences are the first image is shown in WinformsMap, along with added call to WinformsMap Refresh()'s function, while the second image just using the code you provided.



Thank you for the attention.


Hi Ariestya,



I can see the stretch clear, but I can’t recreate in my end. I use the attached code to test and the screenshots are the same with the map itself.

Would you please compare it with your project to see if there is anything i am missing.



Thanks,

Troy

001_LoadAShapeFileFeatureLayer.zip (1.45 KB)