C# 如何将图像大小压缩到字节数组而不影响质量
问题是我想通过UDP发送桌面截图(位图类型)。正如您所知,UDP的容量限制为65000字节,因此我必须“压缩”图像大小以适应此容量。我试过这个: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
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倍,我的错,很抱歉垃圾邮件。