ThinkGeo.com    |     Documentation    |     Premium Support

GdiPlusGeoCanvas DPI

Hi,



I am trying to save map as image using GdiPlusGeoCanvas class. 

I saw the provided printing sample, export works fine.



GdiPlusGeoCanvas has DPI property, I have changed it from default to 400 but didn’t see any differences in the result.

Comment of DPI property states : "The DPI value of the final drawing result, only valid when HasDpi set true"



I didn’t find any property named HasDpi in GdiPlusGeoCanvas.



Would you please inform me how to change DPI of the exported result?



Thank you,

Sean

Hi Sean, 
  
 Thanks to let us know this problem. 
  
 This problem looks a little complex and our developer is working for it. 
  
 We will update status here if we get any progress. 
  
 Regards, 
  
 Don

Hi Don, 
  
 Thank you.  
  
 I hope to hear from you soon. 
  
 Regards, 
  


Hi Sean, 
  
 Thanks for your wait. 
  
 This part related with many functions, so it’s hard to fix. 
  
 We are keep working for it. 
  
 Regards, 
  
 Don

Hi Dan, 
  
 Any update on DPI status? 
  
 Regards, 
 Behnam

Hi Behnam, 
  
 Thanks for your concern. 
  
 It looks our developer haven’t decided to modify it, I will ask for the detail, and for a workaround, you can modify the HorizontalResolution of nativeImage(The parameter of BeginDrawing function), DPI will copy its value when begin draw. 
  
 Regards, 
  
 Don

Hi Don,



Thanks for your answer, As you know HorizontalResolution is a readonly propert therefore to change it I tried to use 
bitmap.SetResolution(300, 300); command.


Problem is that after doing this change quality of image itself doesn’t change but labels became massive.(Please check attached images).


this is my code



     public void Export()
        {
            Dpi = 150;
            var printerInteractiveOverlay = (PrinterInteractiveOverlay)_mapControl.InteractiveOverlays[_printPreviewOverlayKey];
            var pagePrinterLayer = printerInteractiveOverlay.PrinterLayers[_pageLayerKey] as PagePrinterLayer;
            Bitmap bitmap = null;
            try
            {
                if (pagePrinterLayer != null)
                    bitmap = new Bitmap((int) pagePrinterLayer.GetBoundingBox().Width, (int) pagePrinterLayer.GetBoundingBox().Height);
                bitmap.SetResolution(Dpi, Dpi);



                var gdiPlusGeoCanvas = new GdiPlusGeoCanvas { Dpi = Dpi, DrawingQuality = DrawingQuality.HighQuality, CompositingQuality = CompositingQuality.HighQuality };
                
                if (pagePrinterLayer != null)
                {
                    gdiPlusGeoCanvas.BeginDrawing(bitmap, pagePrinterLayer.GetBoundingBox(), _mapControl.MapUnit);
                    gdiPlusGeoCanvas.Clear(new GeoSolidBrush(GeoColor.StandardColors.WhiteSmoke));
                }
                var labelsInAllLayers = new Collection<SimpleCandidate>();
                foreach (PrinterLayer printerLayer in printerInteractiveOverlay.PrinterLayers)
                {
                    printerLayer.IsDrawing = true;
                    if (!(printerLayer is PagePrinterLayer)) printerLayer.Draw(gdiPlusGeoCanvas, labelsInAllLayers);
                    printerLayer.IsDrawing = false;
                }
                gdiPlusGeoCanvas.EndDrawing();
                _dialogService.Filter = DialogFilters.Image;
                string fileName = _dialogService.Save(“Print”, “”, false);
                if (_dialogService.DialogResult)
                {
                    bitmap.Save(fileName, FileExtensionToImageFormat(fileName));                    
                }
            }
            finally
            {
                if (bitmap != null) bitmap.Dispose();
            }
        }




Regards,

Behnam


Print400.jpg (24.5 KB)
Print150.jpg (22.3 KB)

Hi Behnam,



The DPI property is not works currently. So we may occur
some unexpected error. For a workaround, we can generate an image with default
DPI firstly, then change the DPI of this image to what you want. Or please wait
the DPI really works.



Any question please feel free to let us know.


Thanks,


Kevin



Hi Kevin,  
  
 We have reported this bug one year ago and from that time to now we have been asking many times by the users regarding generating high-quality images and having configurable DPI.  
  
 Recently, we have upgraded our MapSuite library from the version 7 to 9 and I am just wondering any update had happened regarding this issue? 
  
 Thanks, 
 Shahin

Hi Shahin,



I am not sure if the DPI will increase the quality of image but some of my colleagues are looking into it to see if any helps. Currently, I am guessing if there is any other ways to export a quality image except DPI. I will let you know if any updates.



Thanks,



Troy

Hi Troy, 
  
 We spoke with your colleague Ben about this issue and he said he will take a look on this task, could you please let us if there is any update? 
  
 Regards, 
 Behnam 
  


Hi Behnam,



May I verify a thing that if you just want to export an high quality image no matter how large the image size is? As I found, in our PrintSample, once we select a A4 paper, then after we click the "To Bitmap", the generated image size is only around 850*1100 (an A4 size) and this image quality would like poor.



However, when I try to use A0 and also do a little changes on the codes, then I can get a 3200*4200 image, which looks much better. Would you please following the blow codes:



1. set the paper size as A0 in SetupMapWithBlankPage method:



PagePrinterLayer pagePrinterLayer = new PagePrinterLayer(PrinterPageSize.AnsiE, PrinterOrientation.Portrait);
            pagePrinterLayer.Open();
            printerOverlay.PrinterLayers.Add("PageLayer", pagePrinterLayer);



2. change the drawing map size in AddMapLayer method:



RectangleShape pageBoundingbox = GetPageBoundingBox(PrintingUnit.Inch);
            mapPrinterLayer.SetPosition(pageBoundingbox.Width, pageBoundingbox.Height, pageBoundingbox.GetCenterPoint().X, pageBoundingbox.GetCenterPoint().Y + 1, PrintingUnit.Inch); // not hard code 8 inches wide and 7 inches tall



Thanks,



Troy