c# - 是否可以在 .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;
}
}
显然,BitmapData
并Bitmap
抛出错误,因为它们在这种情况下不存在。
为了完整起见,这是 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?)
是否有任何解决方法,或者这只是直截了当的“你必须重写所有内容”?
解决方案
只需安装System.Drawing.Common
NuGet 包。它具有您需要的所有功能,并且在 .NET Standard 2.0 上运行。
.NET Standard 仅提供在所有平台之间共享的有限功能,这是运行程序所需的最低要求。您可以通过 NuGet 包使用之前在 .NET Framework 中的许多功能。
只需在 Visual Studio NuGet 包管理器中搜索您要使用的类名,您很可能会找到合适的包。
推荐阅读
- python - Python 脚本在 Jupyter Notebook 上运行良好,但不是 .py 脚本?
- python - Python 代码中的错误“致命 Python 错误:分段错误”
- java - EJBCLIENT000409:没有更多可用的目的地
- python - 如何使用python删除txt文件中的换行符或合并行?
- python - 将 Casia 注解转换为 yolo 格式
- healthvault - HealthVault 类结构
- c# - 限制接口成员访问
- java - Spring - 无法映射 servlet。它返回 404 - 未找到
- regex - Grep/bash 正则表达式 - 交替和一组数字的组合
- parameters - 如何定义具有不同数量参数的函数?