Как я могу сжать скриншот, чтобы отправить его по сети? - PullRequest
0 голосов
/ 06 марта 2012

Мое приложение делает скриншот, используя методы из WinAPI.Экран в порядке, он сохраняется в формате GIF и имеет 76 кБ.JPG, PNG и другие форматы имеют больший размер.Я должен отправить этот файл через сеть, и это занимает несколько секунд, около 2-3 секунд.Можно ли сжать этот файл в .NET или в любом бесплатном внешнем программном обеспечении?Качество не имеет хорошего, потому что я должен прочитать только несколько этикеток.

Спасибо

Ответы [ 3 ]

2 голосов
/ 06 марта 2012

Вы можете посмотреть, как изменить размер изображения в c #. Это довольно легко сделать ... вот код, который я использовал в прошлом для этого:

Image image = Image.FromFile(fi.FullName);
image = resizeImage(image, new Size(120, 120));
EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)85);
ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
image.Save(OutSourceLoc + "/" + fi.Name, jpegCodec, encoderParams);


static Image resizeImage(Image imgToResize, Size size)
    {
        int sourceWidth = imgToResize.Width;
        int sourceHeight = imgToResize.Height;

        float nPercent = 0;
        float nPercentW = 0;
        float nPercentH = 0;

        nPercentW = ((float)size.Width / (float)sourceWidth);
        nPercentH = ((float)size.Height / (float)sourceHeight);

        if (nPercentH < nPercentW)
            nPercent = nPercentH;
        else
            nPercent = nPercentW;

        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);

        Bitmap b = new Bitmap(destWidth, destHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        b.SetResolution(300, 300);
        Graphics g = Graphics.FromImage((Image)b);
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.CompositingQuality = CompositingQuality.HighSpeed;
        g.SmoothingMode = SmoothingMode.HighSpeed;

        g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
        g.Dispose();

        return (Image)b;

    }

    private static ImageCodecInfo GetEncoderInfo(string mimeType)
    {
        // Get image codecs for all image formats 
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

        // Find the correct image codec 
        for (int i = 0; i < codecs.Length; i++)
            if (codecs[i].MimeType == mimeType)
                return codecs[i];
        return null;
    }
1 голос
/ 06 марта 2012

Если вам нужен только текст, возможно, вы можете уменьшить цвета, например 4 цветное серое изображение?

0 голосов
/ 06 марта 2012

Если вы не пытаетесь объединить передачу нескольких изображений в один файл (например, объединяя их в один Zip-файл), я не вижу смысла в сжатии изображений.

JPG, GIF или PNG уже сжаты почти настолько, насколько это возможно.Например, сжатие существующего файла с использованием GZIP - пустая трата вычислительных ресурсов без выгоды.

JPG, GIF, PNG уже используют сжатие так же, как и mp3.

Из Википедии:

Портативная сетевая графика (PNG / ˈpɪŋ / [2]) - это формат растровых изображений, в котором используется сжатие данных без потерь

JPEG (/ ˈdʒeɪpɛɡ / [произносится как jay - peg] - это широко используемый метод сжатия с потерями для цифровой фотографии (изображение)

GIF-изображения сжимаются с использованием Lempel-Ziv-Уэлч (LZW) метод сжатия данных без потерь метод уменьшения размера файла без ухудшения качества изображения

...