C# 将位图转换为字节在生成时返回null
我有一段非常简单的代码,截图后将其转换为字节,以实现屏幕共享。在Unity上使用它时效果很好,但只要我尝试使用build.exe。我有一个NullPointerException,即使没有一个变量是空的。你能帮我吗 我尝试了很多不同的代码来转换位图(以字节为单位),但都给出了相同的错误。请参阅我在下面的代码中尝试的两个版本 首先是屏幕截图功能C# 将位图转换为字节在生成时返回null,c#,unity3d,stream,nullreferenceexception,bitmapimage,C#,Unity3d,Stream,Nullreferenceexception,Bitmapimage,我有一段非常简单的代码,截图后将其转换为字节,以实现屏幕共享。在Unity上使用它时效果很好,但只要我尝试使用build.exe。我有一个NullPointerException,即使没有一个变量是空的。你能帮我吗 我尝试了很多不同的代码来转换位图(以字节为单位),但都给出了相同的错误。请参阅我在下面的代码中尝试的两个版本 首先是屏幕截图功能 public static Bitmap TakeScreenshot() { Rectangle totalSize = System.Win
public static Bitmap TakeScreenshot()
{
Rectangle totalSize = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
Bitmap screenShotBMP = new Bitmap(totalSize.Width, totalSize.Height, PixelFormat.Format32bppArgb);
System.Drawing.Graphics screenShotGraphics = System.Drawing.Graphics.FromImage(screenShotBMP);
screenShotGraphics.CopyFromScreen(totalSize.X, totalSize.Y, 0, 0, totalSize.Size,CopyPixelOperation.SourceCopy);
screenShotGraphics.Dispose();
return
}
然后是创建流的最简单代码
Bitmap bitmap = TakeScreenshot();
ImageConverter converter = new ImageConverter();
bytes = converter.ConvertTo(bitmap, typeof(byte[])) as byte[];
bitmap.Dispose();
我尝试过这样的方法,因为我想改变质量
using (Bitmap bitmap = TakeScreenshot())
{
using (MemoryStream stream = new MemoryStream())
{
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
// Create an Encoder object based on the GUID
// for the Quality parameter category.
System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
// Create an EncoderParameters object.
// An EncoderParameters object has an array of EncoderParameter
// objects. In this case, there is only one
// EncoderParameter object in the array.
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, screenCaptureQuality);
myEncoderParameters.Param[0] = myEncoderParameter;
bitmap.Save(stream,jpgEncoder,myEncoderParameters);
bytes = stream.ToArray();
}
}
它在团结的基础上运行良好,但在构建时却不起作用。我觉得这是一个dll问题,但我真的不知道我应该尝试修复什么
这是我得到的错误
Uploading Crash Report NullReferenceException: Object reference not set to an instance of an object
at System.Drawing.ComIStreamMarshaler+ManagedToNativeWrapper..cctor () [0x00049] in <7649986197334871a851fbd08bc03690>:0
Rethrow as TypeInitializationException: The type initializer for 'ManagedToNativeWrapper' threw an exception.
at System.Drawing.ComIStreamMarshaler.MarshalManagedToNative (System.Object managedObj) [0x00000] in <7649986197334871a851fbd08bc03690>:0
at (wrapper managed-to-native) System.Drawing.GDIPlus.GdipSaveImageToStream(System.Runtime.InteropServices.HandleRef,System.Runtime.InteropServices.ComTypes.IStream,System.Guid&,System.Runtime.InteropServices.HandleRef)
at System.Drawing.Image.Save (System.IO.Stream stream, System.Drawing.Imaging.ImageCodecInfo encoder, System.Drawing.Imaging.EncoderParameters encoderParams) [0x0007e] in <7649986197334871a851fbd08bc03690>:0
at System.Drawing.Image.Save (System.IO.Stream stream, System.Drawing.Imaging.ImageFormat format) [0x00029] in <7649986197334871a851fbd08bc03690>:0
at (wrapper remoting-invoke-with-check) System.Drawing.Image.Save(System.IO.Stream,System.Drawing.Imaging.ImageFormat)
at System.Drawing.ImageConverter.ConvertTo (System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, System.Object value, System.Type destinationType) [0x00055] in <7649986197334871a851fbd08bc03690>:0
at System.ComponentModel.TypeConverter.ConvertTo (System.Object value, System.Type destinationType) [0x00000] in <d465e2b2e5054d2787d6364114c43446>:0
at DuneGestion.Messenger.CallController+<CallInProgress>d__21.MoveNext () [0x00184] in D:\UnityProject\DuneMessenger\Assets\Scripts\DarkRiftServer\CallController.cs:154
at UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) [0x00027] in <4d22bb06641f46818a5212b4c17a7772>:0
上载崩溃报告NullReferenceException:对象引用未设置为对象的实例
在0中的System.Drawing.ComIStreamMarshaler+ManagedToNativeWrapper..cctor()[0x00049]处
作为TypeInitializationException重试:“ManagedToNativeWrapper”的类型初始值设定项引发异常。
位于:0中的System.Drawing.ComIStreamMarshaler.MarshalManagedToNative(System.Object managedObj)[0x00000]处
在(包装器管理为本机)System.Drawing.GDIPlus.GdipSaveImageToStream(System.Runtime.InteropServices.HandleRef,System.Runtime.InteropServices.ComTypes.IStream,System.Guid&,System.Runtime.InteropServices.HandleRef)
在System.Drawing.Image.Save处(System.IO.Stream、System.Drawing.Imaging.ImageCodeInfo编码器、System.Drawing.Imaging.EncoderParameters encoderParams)[0x0007e]输入:0
在System.Drawing.Image.Save处(System.IO.Stream、System.Drawing.Imaging.ImageFormat格式)[0x00029]输入:0
at(wrapper remoting invoke with check)System.Drawing.Image.Save(System.IO.Stream,System.Drawing.Imaging.ImageFormat)
在System.Drawing.ImageConverter.ConvertTo(System.ComponentModel.ITypeDescriptorContext上下文,System.Globalization.CultureInfo区域性,System.Object值,System.Type destinationType)[0x00055]中:0
在0中的System.ComponentModel.TypeConverter.ConvertTo(System.Object值,System.Type destinationType)[0x00000]处
位于d:\UnityProject\DuneMessenger\Assets\Scripts\DarkRiftServer\CallController.cs:154中的DuneGestion.Messenger.CallController+d_u21.MoveNext()[0x00184]
位于:0中的UnityEngine.SetupCoroutine.InvokeMoveNext(System.Collections.IEnumerator枚举器,System.IntPtr returnValueAddress)[0x00027]
感谢和问候您是否尝试过使用Unity?CallController.cs脚本的第154行是什么?可能与System.Windows.Forms重复…Unity不是Windows Forms应用程序,此软件包在您构建时不太可能出现。您好,谢谢您的回答。顺序:@aalmigthy screenscapture如果我没有记错,就只捕获应用程序。我想要整个屏幕,因为你可以共享应用程序之外的内容。第154行是这一行:@ErikOverflow
bitmap.Save(stream、jpgEncoder、myEncoderParameters)
@Ruzihm我有10年的编程经验,我知道什么是NPE。奇怪的是没有一个变量是空的,但我仍然有一个NPE。以前从未见过这种情况。最后@Draco18s,我已经添加了引用,它在Unity的插件文件夹中。它应该会起作用。切勿使用此选项添加任何问题。