Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将图像大小压缩到字节数组而不影响质量_C#_Arrays_Image_Compression_Byte - Fatal编程技术网

C# 如何将图像大小压缩到字节数组而不影响质量

C# 如何将图像大小压缩到字节数组而不影响质量,c#,arrays,image,compression,byte,C#,Arrays,Image,Compression,Byte,问题是我想通过UDP发送桌面截图(位图类型)。正如您所知,UDP的容量限制为65000字节,因此我必须“压缩”图像大小以适应此容量。我试过这个: MemoryStream memoryStream = new MemoryStream(); Bitmap bmp = CaptureDesktopWithCursor2(); ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg); System.Drawin

问题是我想通过UDP发送桌面截图(位图类型)。正如您所知,UDP的容量限制为65000字节,因此我必须“压缩”图像大小以适应此容量。我试过这个:

MemoryStream memoryStream = new MemoryStream();
Bitmap bmp = CaptureDesktopWithCursor2();
        ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
        System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
        EncoderParameters myEncoderParameters = new EncoderParameters(1);
        EncoderParameter myEncoderParameter = new      EncoderParameter(myEncoder, 15L);
        myEncoderParameters.Param[0] = myEncoderParameter;
        bmp.Save(memoryStream, jpgEncoder, myEncoderParameters);
        Bitmap Bit;
                using (memoryStream)
        {

           Bit = new Bitmap(memoryStream);

            byte[] lol = imageToByteArray(Bit);
        }
它确实会改变图像的大小,但仅当您将其保存为.jpg文件时

我还可以做些什么来适应UDP容量(65000)?当然,我尝试过调整图像的大小(它很适合cap),但它对图像的质量影响很大

   public byte[] imageToByteArray(Image imageIn)
        {
            MemoryStream ms = new MemoryStream();
        imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
        return ms.ToArray();
    }

你是说
memoryStream
包含JPEG压缩图像的字节,但是你的最终
byte[]lol
没有?这并不奇怪,因为您正在将JPEG读回
位图
对象。在
imageToByteArray
中会发生什么?UDP不像TCP那样是面向流的协议。如果你想通过UDP发送大文件,你最好考虑制作一个paket头,这样你就可以把文件分成64kb的块,分别发送,然后在另一端重新组装文件,或者回到使用TCP。即使你想压缩一个照片文件(使用像压缩一样的无损压缩算法),如果压缩的文件仍然大于64kB,你也会遇到和以前一样的问题。我添加了imageToByteArray()代码OK,我在imageToByteArray中更改了图像格式->这就是问题所在,大小比以前小了5倍,我的错,对不起,垃圾邮件。你是说
memoryStream
包含JPEG压缩图像的字节,但你的最终
byte[]lol
没有?这并不奇怪,因为您正在将JPEG读回
位图
对象。在
imageToByteArray
中会发生什么?UDP不像TCP那样是面向流的协议。如果你想通过UDP发送大文件,你最好考虑制作一个paket头,这样你就可以把文件分成64kb的块,分别发送,然后在另一端重新组装文件,或者回到使用TCP。即使你想压缩一个照片文件(使用像压缩一样的无损压缩算法),如果压缩后的文件仍然大于64kB,你也会遇到和以前一样的问题。我添加了imageToByteArray()代码OK,我在imageToByteArray中更改了图像格式->这就是问题所在,大小比以前小了5倍,我的错,很抱歉垃圾邮件。