ImageSDK : C# (Windows)

We provide .NET language bindings based on .NET Standard 2.0. Even though .NET is cross platform, our .NET assembly is not. Since it depends directly on unmanaged code compiled for Windows.

Prerequisites

  • Windows 10 (x64)

  • .NET Standard 2.0 compatible .NET SDK

  • MSVC Redistributable 2015-2022

The C# libraries are provided as part of our standard Windows library ZIP packages. You can download the package, containing both C# and C++ libraries at the Download page.

Tip

If you do not have the Microsoft Visual C++ toolchain installed, you will need to download and install the redistributable runtime.

Download the newest runtime from Microsoft here: Latest Visual C++ Redistributable downloads.

Setup Your Project

To account for those who do not use Visual Studio, we use the command line .NET Core utility dotnet in this tutorial.

Open up PowerShell or command prompt, and navigate to the location where you want to put our sample project. Initialize a new .NET Core console based application:

PS> dotnet new console -n helloworld

Here we called our sample project helloworld.

Now, cd into the helloworld directory. Copy your downloaded ImageSDK zip file into the project folder and extract the archive. If you use PowerShell you can:

PS> Expand-Archive .\ImageSdk-Win_Release_2.X.X.zip -DestinationPath .

You will end up with libraries for both C++ and C# inside a folder named: dest. The resulting directory layout should be:

dest
|-- Cs
|-- include
`-- lib

We do not need neither the include nor the lib subdirectories, you can delete those if you want to.

Project File

The dotnet util created a project file for us: helloworld.csproj. We need to add the ImageSDK assembly to this, and also add a post-build copy step. This should copy the file ImageSdkCBindingsForCs.dll to the build output directory. This file is needed by the ImageSDK library assembly.

Add the ImageSDK C# library assembly and dependency to helloworld.csproj. The xml snippet below should be appended inside the existing Project tag:

<ItemGroup>

      <!-- Include ImageSDK C# API -->
      <Reference Include="ImageSdkCs.dll">
          <HintPath>dest/Cs/ImageSdkCs.dll</HintPath>
      </Reference>

      <!-- Dependency of ImageSDK C# API -->
      <None Include="dest/Cs/ImageSdkCBindingsForCs.dll" Link="ImageSdkCBindingsForCs.dll">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </None>

      <!-- Include stitching and stacking DLLs, since these are hard deps -->
      <Content Include="dest/Cs/libifcoremd.dll" Link="libifcoremd.dll" Visible="false">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="dest/Cs/libifportmd.dll" Link="libifportmd.dll" Visible="false">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="dest/Cs/libmmd.dll" Link="libmmd.dll" Visible="false">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="dest/Cs/P1CIRSTACK.dll" Link="P1CIRSTACK.dll" Visible="false">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="dest/Cs/Qt5Core.dll" Link="Qt5Core.dll" Visible="false">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>

  </ItemGroup>

We added both the assembly (ImageSdkCs.dll) for the C# API and its dependency, a DLL file compiled by the Visual C++ compiler (ImageSdkCBindingsForCs.dll).

Note

Despite of the both files having the .dll extension, they are not the same format. One is a .NET assembly file, and the others are a standard dynamic library file with plain C functions inside.

Source Code

The console application template include a sample source file: Program.cs. Replace its content with this:

using System;
using P1.ImageSdk;

namespace helloworld
{
    class Program
    {
       static void Main(string[] args)    
        {
            // Setup the path to the SensorProfiles or copy the directory where the sensor profiles are located to where you program is executed
            Sdk.SetSensorProfilesLocation("./ SensorProfiles");

            Console.WriteLine("Open IIQ file");

            // Open an IIQ-file (edit the name and path to an IIQ-file)
            RawImage iiq = new RawImage("input-file.iiq");

            // Setup a convert config with the description about how to convert image into Rgb domain                
            ConvertConfig config = new ConvertConfig();
            config.SetOutputScale(.25);

            Console.WriteLine("Do the conversion...");

            P1.ImageSdk.BitmapImage bitmap = iiq.Convert(config);

            Console.WriteLine("Write image to tiff file...");

            // The resulting bitmap can now be stored to a tiff file.            
            TiffConfig tiffConfig = new TiffConfig();
            _ = iiq.WriteAsTiff("output-file.tiff", bitmap, tiffConfig);

            Console.WriteLine("Done!");
        }
    }
}

Build & Run

To compile the project, simply run the build command:

PS> dotnet build

This will build and copy the needed (assembly’s and DLL’s) to the build output directory. For .NET 5 this is bin/Debug/net5.

To run the application, first cd into the build directory and run the executable:

PS> cd bin/Debug/net5
PS> helloworld.exe
Open IIQ file
Do the conversion...
Write image to tiff file...
Done!
PS>

Warning

We deliberately changed the working directory to the location of the executable. This is because the .NET runtime expects to find the ImageSdkCBindingsForCs.dll file in the current working directory.

If we attempted to run the application from the helloworld project folder, we would get an exception:

System.DllNotFoundException: C Bindings DLL (ImageSdkCBindingsForCs.dll) not found at: .\helloworld