Skip to content

Commit

Permalink
Add support to get raw image data in csharp (#5293)
Browse files Browse the repository at this point in the history
  • Loading branch information
szekerest committed Jun 10, 2016
1 parent 9996f07 commit 3dc88f7
Show file tree
Hide file tree
Showing 5 changed files with 236 additions and 3 deletions.
4 changes: 3 additions & 1 deletion mapscript/csharp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,9 @@ ADD_CUSTOM_COMMAND(TARGET csharpmapscript
COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /out:HTMLtemplate.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\HTMLtemplate.cs
COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /out:RFC24.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\RFC24.cs
COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /r:System.Drawing.dll /out:drawmapDirect.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\drawmapDirect.cs
COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /r:System.Drawing.dll /out:drawmapDirectPrint.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\drawmapDirectPrint.cs
COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /r:System.Drawing.dll /out:drawmapDirectPrint.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\drawmapDirectPrint.cs
COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /r:mapscript_csharp.dll /r:System.Drawing.dll /out:drawmapGDIPlus.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\drawmapGDIPlus.cs
#COMMAND ${CSHARP_COMPILER} ${PLATFORM_TARGET} /lib:C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF /r:mapscript_csharp.dll /r:System.Xaml.dll /r:WindowsBase.dll /r:PresentationCore.dll /out:drawmapWPF.exe ${PROJECT_SOURCE_DIR}\\mapscript\\csharp\\examples\\drawmapWPF.cs
COMMENT "Compiling c# source files"
)

Expand Down
3 changes: 2 additions & 1 deletion mapscript/csharp/Makefile.vc
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,8 @@ $(CSHARP_DLL)::
$(CSC) $(CSFLAGS) /r:mapscript_csharp.dll /out:HTMLtemplate.exe examples\HTMLtemplate.cs
$(CSC) $(CSFLAGS) /r:mapscript_csharp.dll /out:RFC24.exe examples\RFC24.cs
$(CSC) $(CSFLAGS) /r:mapscript_csharp.dll /r:System.Drawing.dll /out:drawmapDirect.exe examples\drawmapDirect.cs
$(CSC) $(CSFLAGS) /r:mapscript_csharp.dll /r:System.Drawing.dll /out:drawmapDirectPrint.exe examples\drawmapDirectPrint.cs
$(CSC) $(CSFLAGS) /r:mapscript_csharp.dll /r:System.Drawing.dll /out:drawmapDirectPrint.exe examples\drawmapDirectPrint.cs
$(CSC) $(CSFLAGS) /r:mapscript_csharp.dll /r:System.Drawing.dll /out:drawmapGDIPlus.exe examples\drawmapGDIPlus.cs

test:
!IFDEF MONO
Expand Down
26 changes: 25 additions & 1 deletion mapscript/csharp/csmodule.i
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,11 @@ static SWIG_CSharpByteArrayHelperCallback SWIG_csharp_bytearray_callback = NULL;
%typemap(in) SWIG_CSharpByteArrayHelperCallback %{ $1 = ($1_ltype)$input; %}
%typemap(csin) SWIG_CSharpByteArrayHelperCallback "$csinput"

%typemap(imtype) (unsigned char* pixels) "IntPtr"
%typemap(cstype) (unsigned char* pixels) "IntPtr"
%typemap(in) (unsigned char* pixels) %{ $1 = ($1_ltype)$input; %}
%typemap(csin) (unsigned char* pixels) "$csinput"

%csmethodmodifiers getBytes "private";
%ignore imageObj::getBytes();
%extend imageObj
Expand All @@ -259,7 +264,26 @@ static SWIG_CSharpByteArrayHelperCallback SWIG_csharp_bytearray_callback = NULL;
}
callback(buffer.data, buffer.size);
msFree(buffer.data);
}
}

int getRawPixels(unsigned char* pixels) {
if (MS_RENDERER_PLUGIN(self->format)) {
rendererVTableObj *renderer = self->format->vtable;
if(renderer->supports_pixel_buffer) {
rasterBufferObj rb;
int status = MS_SUCCESS;
int size = self->width * self->height * 4 * sizeof(unsigned char);

status = renderer->getRasterBufferHandle(self,&rb);
if(UNLIKELY(status == MS_FAILURE)) {
return MS_FAILURE;
}
memcpy(pixels, rb.data.rgba.pixels, size);
return status;
}
}
return MS_FAILURE;
}
}

%ignore imageObj::write;
Expand Down
97 changes: 97 additions & 0 deletions mapscript/csharp/examples/drawmapGDIPlus.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/******************************************************************************
* $Id$
*
* Project: MapServer
* Purpose: A C# based mapscript example to draw the map directly onto a GDI+ bitmap.
* Author: Tamas Szekeres, szekerest@gmail.com
*
******************************************************************************
* Copyright (c) 1996-2008 Regents of the University of Minnesota.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies of this Software or works derived from this Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*****************************************************************************/

using System;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using OSGeo.MapServer;

/// <summary>
/// A C# based mapscript example to draw the map directly onto a GDI+ bitmap.
/// </summary>
class DrawMap
{
public static void usage()
{
Console.WriteLine("usage: DrawMapGDIPlus {mapfile} {outfile}");
System.Environment.Exit(-1);
}

public static void Main(string[] args)
{
Console.WriteLine("");
if (args.Length < 2) usage();

mapObj map = new mapObj(args[0]);

Console.WriteLine("# Map layers " + map.numlayers + "; Map name = " + map.name);
for (int i = 0; i < map.numlayers; i++)
{
Console.WriteLine("Layer [" + i + "] name: " + map.getLayer(i).name);
}

try
{
Bitmap mapImage = new Bitmap(map.width, map.height, PixelFormat.Format32bppRgb);
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
using (imageObj image = map.draw())
{
BitmapData bitmapData = mapImage.LockBits(new Rectangle(0, 0, image.width, image.height), ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
try
{
if (image.getRawPixels(bitmapData.Scan0) == (int)MS_RETURN_VALUE.MS_FAILURE)
{
Console.WriteLine("Unable to get image contents");
}
}
finally
{
mapImage.UnlockBits(bitmapData);
}

Console.WriteLine("Rendering time: " + stopwatch.ElapsedMilliseconds + "ms");

mapImage.Save(args[1]);
}
}
catch (Exception ex)
{
Console.WriteLine( "\nMessage ---\n{0}", ex.Message );
Console.WriteLine(
"\nHelpLink ---\n{0}", ex.HelpLink );
Console.WriteLine( "\nSource ---\n{0}", ex.Source );
Console.WriteLine(
"\nStackTrace ---\n{0}", ex.StackTrace );
Console.WriteLine(
"\nTargetSite ---\n{0}", ex.TargetSite ); }
}
}

109 changes: 109 additions & 0 deletions mapscript/csharp/examples/drawmapWPF.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/******************************************************************************
* $Id$
*
* Project: MapServer
* Purpose: A C# based mapscript example to draw the map directly onto a WPF image.
* Author: Tamas Szekeres, szekerest@gmail.com
*
******************************************************************************
* Copyright (c) 1996-2008 Regents of the University of Minnesota.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies of this Software or works derived from this Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*****************************************************************************/

using System;
using System.IO;
using System.Diagnostics;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using OSGeo.MapServer;

/// <summary>
/// A C# based mapscript example to draw the map directly onto a WPF image.
/// </summary>
class DrawMap
{
public static void usage()
{
Console.WriteLine("usage: DrawMapWPF {mapfile} {outfile}");
System.Environment.Exit(-1);
}

public static void Main(string[] args)
{
Console.WriteLine("");
if (args.Length < 2) usage();

mapObj map = new mapObj(args[0]);

Console.WriteLine("# Map layers " + map.numlayers + "; Map name = " + map.name);
for (int i = 0; i < map.numlayers; i++)
{
Console.WriteLine("Layer [" + i + "] name: " + map.getLayer(i).name);
}

try
{
WriteableBitmap mapImage = new WriteableBitmap(map.width, map.height, 96, 96, PixelFormats.Bgr32, null);
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
using (imageObj image = map.draw())
{
// Reserve the back buffer for updates.
mapImage.Lock();
try
{
if (image.getRawPixels(mapImage.BackBuffer) == (int)MS_RETURN_VALUE.MS_FAILURE)
{
Console.WriteLine("Unable to get image contents");
}
// Specify the area of the bitmap that changed.
mapImage.AddDirtyRect(new Int32Rect(0, 0, map.width, map.height));
}
finally
{
// Release the back buffer and make it available for display.
mapImage.Unlock();
}

Console.WriteLine("Rendering time: " + stopwatch.ElapsedMilliseconds + "ms");

// Save the bitmap into a file.
using (FileStream stream = new FileStream(args[1], FileMode.Create))
{
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(mapImage));
encoder.Save(stream);
}
}
}
catch (Exception ex)
{
Console.WriteLine( "\nMessage ---\n{0}", ex.Message );
Console.WriteLine(
"\nHelpLink ---\n{0}", ex.HelpLink );
Console.WriteLine( "\nSource ---\n{0}", ex.Source );
Console.WriteLine(
"\nStackTrace ---\n{0}", ex.StackTrace );
Console.WriteLine(
"\nTargetSite ---\n{0}", ex.TargetSite ); }
}
}

0 comments on commit 3dc88f7

Please sign in to comment.