ThinkGeo.com    |     Documentation    |     Premium Support

Get bitmap from WpfMap without control being visible

Hi Guys,


Using the WpfMap control (version 4.5) what we want to do is to obtain a bitmap of the displayed map without the control being visible to the user. Obtaining a bitmap of the control is easy; the hard bit is getting the control to render correctly when it is not visible before taking the snapshot for the bitmap.
Scenario would be something like:-
1.       Create a window with the WpfMap embedded on it.
2.       Load a shapefile for the World.
3.       Add a bunch in InMemoryFeature layers.
4.       Zoom to the BoundingBox enclosing the InMemoryFeature layers.
5.       Size the window to obtain the correct bitmap size;
6.       Refresh the map.
7.       Snapshot the control to obtain the bitmap
8.       Dispose of the window.
We already have steps 1-6 and 8 done, its step 7 I can’t find a way of doing without making the window visible in order that the control draws before we grab the bitmap. If it is not visible no drawing seems to take place.
Any thoughts?
Regards
John
 

Hi John, 

 

I guess you are using RenderTargetBitmap to render current visual to a bitmap right. I think now we don't have a way to save the map without showing the window. Because we used the ActualWidth/Height to render the map. If your scenario is only layers, you can use the following method to return you a bitmap for all the layers.

        public static Bitmap GetBitmap(IEnumerable<Layer> layers, RectangleShape currentExtent, GeographyUnit mapUnit, int width, int height)
        {
            Bitmap nativeImage = new Bitmap(width, height);
            Collection<SimpleCandidate> simpleCandidates = new Collection<SimpleCandidate>();
            GdiPlusGeoCanvas geoCanvas = new GdiPlusGeoCanvas();
            geoCanvas.BeginDrawing(nativeImage, currentExtent, mapUnit);
            foreach (Layer layer in layers)
            {
                layer.Draw(geoCanvas, simpleCandidates);
            }
            geoCanvas.EndDrawing();
            return nativeImage;
        }



Hope it helps; if there is anything misunderstanding, just let us know.



Thanks,

Howard



Hi John, 
  
  Have you tried to set the form transparency to 100% or 99%? I’m wondering if the control would render in a “visible”-but-transparent form 
  
 Carlos

Hi Carlos,


Tried that, does not seem to work.  Still investigating...


John


 



Hi John, 
  
 You might misunderstand my idea. Mine is just render the overlays into a bitmap and print it out which is another way you might use. Could you provide us more information so that we can provide you better idea? 
  
 Thanks, 
 Howard