.Net Core unable to use Bitmap
Asked Answered
N

5

27

I am working on a Web Service using .Net Core 2.1.

I have a byte array containing all pixels values (in grey scale), a width, a height. I want to create a bitmap from theses parameters.

There is my code (from a working .Net Framework 4 project) :

public FileResult PostSealCryptItem(Byte[] matrix, int width, int height)
{
    Bitmap bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
    for (int y = 0; y < height; y++)
        for (int x = 0; x < width; x++)
            bmp.SetPixel(x, y, Color.FromArgb(ToArgb(matrix, x, y)));

    Byte[] data = BitmapToByteArray(bmp);
    FileContentResult result = new FileContentResult(data , "image/png");

    return result;
}

But in .NET Core, I've the error :

The type or namespace name 'Bitmap' could not be found (are you missing a using directive or an assembly reference?)

I've try to add reference to System.Drawing but it did not work.

Nebraska answered 14/1, 2019 at 11:8 Comment(9)
There is no built in image manipulation in .NET Core, you need to use a third party tool, but there are some good ones. For example I'm currently using SkiaSharp.Graybeard
Possible duplicate of How to use bitmap resources in ASP.NET Core app?Palatalized
There's System.Drawing.CommonEquivalence
@Equivalence Downside of that is that you are limited to running on Windows I believe?Graybeard
@Graybeard looks like it, now I see it has Microsoft.Win32.SystemEvents as a dependencyEquivalence
you could use the windows compatibility pack. Guess you have to stick with windows then... blogs.msdn.microsoft.com/dotnet/2017/11/16/…Shaneka
hanselman.com/blog/HowDoYouUseSystemDrawingInNETCore.aspxShaneka
@Equivalence Yeah, that's why I wouldn't recommend using it. Especially considering SkiaSharp and ImageSharp both do everything (and more). Skia also supports webp which can be useful.Graybeard
Do read learn.microsoft.com/en-us/dotnet/api/system.drawing#remarksCythiacyto
R
49

Bitmap is part of System.Drawing which was included in .Net Framework.

It is no longer included with .net core and must be added manually.

Install the Nuget package System.Drawing.Common by right-clicking on your project in visual studio and choosing Manage Nuget Packages

In the Nuget Package manager, click on the Browse Tab, search for System.Drawing.Common in the top and it should be the first Package, official by Microsoft. It will work just as in .Net Framework: enter image description here

Ramsdell answered 28/9, 2020 at 9:53 Comment(2)
Just a note for those who will come here later - as for net 6 the System.Drawing.Common package considered to be Windows-only and can not be used on Mac or Linux anymore (learn.microsoft.com/en-us/dotnet/core/compatibility/…)Boarding
How to make it supported for linux as well?Maccarone
S
4

You can use ImageSharp instead of System.Drawing

https://github.com/SixLabors/ImageSharp

Nuget console

Install-Package SixLabors.ImageSharp -Version 1.0.0-beta0005
Shaneka answered 14/1, 2019 at 11:22 Comment(0)
V
4

There is a NuGet package instead of System.Drawing, you can use it

Install-Package System.Drawing.Common
Volsci answered 7/9, 2021 at 13:52 Comment(0)
T
1

Aspose.Drawing is a drop-in cross-platform replacement for System.Drawing. The library is fully managed and supports Web Services using .Net Core 2.1. (I'm one of the developers.)

Take answered 5/11, 2020 at 17:12 Comment(3)
Is that a commercial product ?Purify
@Purify Yes.Take
For most requirements, there is no advantage in using commercial and closed-source components.Dogeatdog
W
1

This one worked for me dotnet add package System.Drawing.Common --version 5.0.3

Weywadt answered 22/12, 2021 at 14:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.