ThinkGeo.com    |     Documentation    |     Premium Support

Map.DrawToBitmap Clips Output

Hello,


I am having a "wombee"  (works on my box) problem with the output of the DrawToBitmap functionality. The problem being that on my Windows 7 64bit box it works fine. I can get the bitmap from the form and then resize it to my desired size to be used in a thumbnail (map.bmp). However, when I move the application to a Windows 2008 Server 64b  it the resulting thumbnail comes out clipped (map_clipped.bmp). I use the exact same library on both machines. Any idea as to what can be wrong. Here is the code used to create the thumbnail.


public Bitmap GetMapBitmap(int width, int height)

        {

            // now create the bitmap and pass it back

            Bitmap bitmap = new Bitmap(Map.Width, Map.Height,PixelFormat.Format24bppRgb);

            Bitmap mapBmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);

            Graphics gfx = Graphics.FromImage(mapBmp);


            Map.DrawToBitmap(bitmap, new Rectangle(0, 0, Map.Width, Map.Height));


            gfx.DrawImage(bitmap, new Rectangle(0, 0, width, height));


            return mapBmp;


        }


 


Any help is greatly appreciated. Thanks!


 


Eric



Eric, 
  
 Thanks for your post and questions. 
  
 Could you have a try to save bitmap after call the DrawToBitmap into disk and upload both of them here? It is very wield problem. 
  
 Thanks. 
  
 Yang 


Sorrry, I thought I had attached the bitmaps to the original post. Here they are: map.bmp (Windows 2007 64 bit) and map_clipped (Windows Server 2008 64 bit).


Eric


 


 



Hmm, the attachments don't seem to be in my last post. Trying again.



The attachments don't seem to be working for me. I browse to the files and upload.  It does indicate them as current attachments. However the options: Create Thumbnail, Inset Image and  DIsplay Link do not indicate they are selected!? and I have no means to select them. Any help here? Thanks.


 


Eric


 



If you are having difficulties attaching the file in the Discussion Forum post, please, send your file to support@thinkgeo.com. In the email, say to what post it is related to. Thank you.

I have emailed the files as directed.


 


Eric S.



Eric's Comments:

The map_before.bmp is the output from Map.DrawToBitmp on a windows 2008 server 64bit. As you can see it is already cropped before I do the resizing. The map.bmp is the end results on my windows 7 64 bit box. The map_clipped.bmp is the end result on the 2008 serever.



Map:





Map Before:





Map Clipped:



I have found a workaround to my problem, but  it does not actually solve the problem. A little backstory first. I may shed some light as to why I am having the problem. One thing I did not mention was that the whole mapping process takes place in WCF service which is hosted by a Windows Service. I realized when I developed the service I should probably try out the MapEngine, but I had a very large class library that performed all my core mapping functionality, most importantly reading layer definitions from a layer metadata repository and dynamically adding them to the map, for our existing interactive winforms mapping application. I did not want to reinvent the wheel on this as MapEngine deals with layers completely different than WinformsMap.


So I thought that I would just create a parentless WinformsMap but never add it to anything. Something as simple as:


WinformsMap Map = new WinformsMap {Height = 600, Width = 400};


and use that as my map. In extensive testing on my Windows 7 64 bit box it worked like a charm. I could create the map with my existing class libraries and simple Map.DrawToBitmap, convert to a smaller size and I had the thumbnail I needed. Things went south when I tried to implement on the Window 2008 server. I got the clipping behavior previously outlined in this post.


One interesting point to note, during initial testing of the WCF service on the 2008 server I was hosting my WCF service from a form and everything worked great, but as soon as I deployed using a Windows Service the output image got clipped. Maybe that difference may identify the problem.


My solution was to go ahead and not reinvent the wheel with new class libraries for MapEngine. I went ahead and created the Map using the parentless WinformsMap control, just as I had been, but instead of Map.DrawToBitMap I convert the contents of the WinformsMap to a MapEngine and get the bitmap from MapEngine. Once I thought it out the conversion was pretty simple. I have included the snippet of how I am doing this.  Please note that I am accounting for specific overlays in my Winforms map and how they translate to mapEngine layers.


 Hope this helps anyone who may have experienced this problem or highlights why the problem was occuring in the first place.


 


Eric



public MapEngine ConvertMapToEngine()
{

            MapEngine mapEngine = new MapEngine();
            mapEngine.ShowLogo = false;
            LayerOverlay layerOverlay;

            foreach (Overlay overlay in Map.Overlays)
            {
                if (object.Equals(overlay.GetType(), typeof(LayerOverlay)))
                {
                    layerOverlay = (LayerOverlay)overlay;
                    foreach (Layer layer in layerOverlay.Layers)
                    {
                        if (overlay.Name == "BaseMapOverlay")
                            mapEngine.DynamicLayers.Add(layer);

                        if (overlay.Name == "ImageOverlay")
                            mapEngine.StaticLayers.Add(layer);
                    }
                }
            }

            mapEngine.CurrentExtent = Map.CurrentExtent;

            return mapEngine;
 }

 public Bitmap GetMapBitmap2(int width, int height)
 {
            MapEngine mapEngine = ConvertMapToEngine();
            Bitmap bitmap = new Bitmap(width, height);

            mapEngine.OpenAllLayers();
            mapEngine.DrawStaticLayers(bitmap, Map.MapUnit);
            mapEngine.DrawDynamicLayers(bitmap, Map.MapUnit);
            mapEngine.CloseAllLayers();

            bitmap.Save(@"C:\mapengine.bmp");

            return bitmap;

}


Eric, 
  
 Thanks for your post and sharing, I appreciate it very much. 
  
 I am glad seeing your workaround can solve your problem somehow. Now, it is very strange that as Ryan already has pointed out is that in windows 2008 server 64 bit, before resizing, it is already cropped and the left part lines of tiles seem missing. I am wondering this is only happening in your specified application or on any application as easy as Display only one shape file? 
  
 Thanks. 
  
 Yale 


A simple application on the 2008 server works fine. I'll reiterate a very specific circumstance. The WCF service I am using to generate the thumbnail works fine when I self-host the WCF service from a form. When I host the WCF service in a Windows Service, the cropping behavior occurs. (only on 2008 server 64b, it works fine running as a Windows Service on Windows 7 64b). So it is very specific to something to the Windows Service hosted process.


I am using memory tiling for images, so an issue there could cause the cropped image, but not the shape as well?


For my current application I have a working solution. For any future map oriented WCF application development I'll definitely leverage MapEngine.


Still a mystery on your end. Good Luck. Thanks for the support.


Eric.



Eric, 
  
 Thanks for your explanations. 
  
 Your application seems quite complicated, I appreciate it very much. I will take a try to see if I can catch the 1% chance to recreate it, please do not hesitate to let me know if you have the chance to create it in a simple case. 
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale