C# 值不能为null。参数名称:编码器

C# 值不能为null。参数名称:编码器,c#,memorystream,save-image,C#,Memorystream,Save Image,我需要拍摄部分屏幕的截图,并检查截图是否与pictureBox2中的图像相同 这一行行不通: pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat); 错误是 值不能为空。 参数名称:编码器 我的代码如下所示: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawi

我需要拍摄部分屏幕的截图,并检查截图是否与
pictureBox2
中的图像相同

这一行行不通:

pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
错误是

值不能为空。
参数名称:编码器

我的代码如下所示:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        Bitmap screenshot = new Bitmap(SystemInformation.VirtualScreen.Width,
            SystemInformation.VirtualScreen.Height,
            PixelFormat.Format32bppArgb);
        public Form1()
        {
            InitializeComponent();

        }



        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Bitmap screenshot = new Bitmap(SystemInformation.VirtualScreen.Width,
                SystemInformation.VirtualScreen.Height,
                PixelFormat.Format32bppArgb);
            Graphics screenGraph = Graphics.FromImage(screenshot);
            screenGraph.CopyFromScreen(
                SystemInformation.VirtualScreen.X + 1080,
                SystemInformation.VirtualScreen.Y + 100,
                0,
                0,
                new Size(190, 480),//SystemInformation.VirtualScreen.Size,
                CopyPixelOperation.SourceCopy);
            pictureBox1.Image = screenshot;
            MemoryStream ms = new MemoryStream();
            pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
            String image_one = Convert.ToBase64String(ms.ToArray());
            ms.Position = 0;
            pictureBox2.Image.Save(ms, pictureBox2.Image.RawFormat);
            String image_three = Convert.ToBase64String(ms.ToArray());
            ms.Position = 0;
            ms.Close();
            if (image_one.Equals(image_three))
                textBox1.Text = "SAME";
            else
                textBox1.Text = "DIFFERENT";
        }

    }
}

我能做什么?

您的图像存在于内存中,因此没有为RAW格式设置编码器。指定诸如System.Drawing.Imaging.ImageFormat.Png之类的格式。

您的图像存在于内存中,因此没有为RawFormat设置编码器。指定类似System.Drawing.Imaging.ImageFormat.Png之类的格式。

pictureBox1.Image@MajkeloDev通过代码导致NRE而不是ArgumentNullExceptionDebug,并查看到底什么是null,这应该不是问题。另外,您可能希望将MemoryStream打包到using语句中:using(MemoryStream ms=new MemoryStream()){}在结束括号的末尾,MemoryStream将被自动处理。@Maiky Ganon-将这一行放在Try Catch块中,并向我们展示stacktrace@HimBromBeere你是对的。pictureBox1.Image@MajkeloDev会通过你的代码导致NRE而不是ArgumentNullExceptionDebug,并查看什么是null,这应该不是问题。另外,您可能希望将MemoryStream打包到using语句中:using(MemoryStream ms=new MemoryStream()){}在结束括号的末尾,MemoryStream将自动处理。@Maiky Ganon-将此行放入Try-Catch块中,并向我们显示stacktrace@HimBromBeere你说得对。