C# 将位图转换为字节在生成时返回null

C# 将位图转换为字节在生成时返回null,c#,unity3d,stream,nullreferenceexception,bitmapimage,C#,Unity3d,Stream,Nullreferenceexception,Bitmapimage,我有一段非常简单的代码,截图后将其转换为字节,以实现屏幕共享。在Unity上使用它时效果很好,但只要我尝试使用build.exe。我有一个NullPointerException,即使没有一个变量是空的。你能帮我吗 我尝试了很多不同的代码来转换位图(以字节为单位),但都给出了相同的错误。请参阅我在下面的代码中尝试的两个版本 首先是屏幕截图功能 public static Bitmap TakeScreenshot() { Rectangle totalSize = System.Win

我有一段非常简单的代码,截图后将其转换为字节,以实现屏幕共享。在Unity上使用它时效果很好,但只要我尝试使用build.exe。我有一个NullPointerException,即使没有一个变量是空的。你能帮我吗

我尝试了很多不同的代码来转换位图(以字节为单位),但都给出了相同的错误。请参阅我在下面的代码中尝试的两个版本

首先是屏幕截图功能

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的插件文件夹中。它应该会起作用。切勿使用此选项添加任何问题。