首页 > 解决方案 > 是否可以在 .NET Standard 中使用 System.Drawing.Bitmap 而无需重写代码?

问题描述

我正在尝试将我编写的代码从 .NET Framework 4.7.2 移植到 .NET Standard 2.0。该项目高度依赖System.Drawing.Bitmap对象来处理图像数据,主要来自System.IO.Stream对象。有什么方法可以让我在不重写当前使用位图的所有内容的情况下移植此代码?

我已经看过其他问题,所以我知道 .NET Standard 和 Bitmap 相处得不好,但我想知道是否有解决方法可以让我在花费一个月重写依赖的代码之前保留现有代码上Bitmap

有问题的代码主要集中在图像编辑和处理上。这是一个应该反转图像的功能。

Bitmap bmp;

...

public void Invert()
{
    unsafe
    {
        BitmapData bitmapData = bmp.LockBits(new Rectangle(0, 0, Bitmap.Width, Bitmap.Height), ImageLockMode.ReadWrite, Bitmap.PixelFormat);
        int bytesPerPixel = System.Drawing.Bitmap.GetPixelFormatSize(Bitmap.PixelFormat) / 8;
        int heightInPixels = bitmapData.Height;
        int widthInBytes = bitmapData.Width * bytesPerPixel;
        byte* ptrFirstPixel = (byte*)bitmapData.Scan0;

        for (int y = 0; y < heightInPixels; y++)
        {
            byte* currentLine = ptrFirstPixel + (y * bitmapData.Stride);
            for (int x = 0; x < widthInBytes; x = x + bytesPerPixel)
            {
                currentLine[x] = (byte)(255 - currentLine[x]);
                currentLine[x + 1] = (byte)(255 - currentLine[x + 1]);
                currentLine[x + 2] = (byte)(255 - currentLine[x + 2]);
            }
        }
        Bitmap.UnlockBits(bitmapData);
        PixIsActive = false;
    }
}

显然,BitmapDataBitmap抛出错误,因为它们在这种情况下不存在。

为了完整起见,这是 Visual Studio 抛出的示例编译器错误:

1>XImage.cs(4,22,4,29): error CS0234: The type or namespace name 'Imaging' does not exist in the namespace 'System.Drawing' (are you missing an assembly reference?)

是否有任何解决方法,或者这只是直截了当的“你必须重写所有内容”?

标签: c#bitmap.net-standard

解决方案


只需安装System.Drawing.CommonNuGet 包。它具有您需要的所有功能,并且在 .NET Standard 2.0 上运行。

.NET Standard 仅提供在所有平台之间共享的有限功能,这是运行程序所需的最低要求。您可以通过 NuGet 包使用之前在 .NET Framework 中的许多功能。

只需在 Visual Studio NuGet 包管理器中搜索您要使用的类名,您很可能会找到合适的包。


推荐阅读