Сжатие растрового изображения перед отправкой по сети - PullRequest
2 голосов
/ 14 июня 2010

Я пытаюсь отправить снимок экрана по сети, поэтому мне нужно сжать его перед отправкой. Есть ли библиотека или метод для этого?

Ответы [ 4 ]

3 голосов
/ 14 июня 2010

Когда вы сохраняете изображение в поток, у вас есть для выбора формата. Почти все растровые форматы (BMP, GIF, JPG, PNG) используют 1 или более форм сжатия. Так что просто выберите подходящий формат и убедитесь, что отправитель и получатель согласны с ним.

1 голос
/ 16 января 2018

Если вы ищете что-то для сжатия изображения по качеству, то вот оно -

    private Image GetCompressedBitmap(Bitmap bmp, long quality)
    {
        using (var mss = new MemoryStream())
        {
            EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
            ImageCodecInfo imageCodec = ImageCodecInfo.GetImageEncoders().FirstOrDefault(o => o.FormatID == ImageFormat.Jpeg.Guid);
            EncoderParameters parameters = new EncoderParameters(1);
            parameters.Param[0] = qualityParam;
            bmp.Save(mss, imageCodec, parameters);
            return Image.FromStream(mss);
        }
    }

Используйте это -

var compressedBmp = GetCompressedBitmap(myBmp, 60L);
1 голос
/ 14 июня 2010

Попробуйте System.IO.DeflateStream класс.

0 голосов
/ 18 марта 2014

Может быть, вы можете использовать:

private Bitmap compressImage(Bitmap image) {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 
        int options = 100;
        while ( baos.toByteArray().length / 1024>100) { // 
            baos.reset();
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 
            options -= 10;// 10
        }
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 
        return bitmap;
    }
...