Уменьшение уменьшенного изображения - PullRequest
0 голосов
/ 24 декабря 2011

У меня есть приложение для обмена изображениями, где пользователи загружают изображения, и я беру миниатюры этих изображений ... однако, все работает нормально, но иногда размер миниатюр изображения (600 * 800) составляет почти 1 МБ, что очень многотам в любом случае изменить разрешение изображения или что-то, чтобы сделать размер, как. 100 КБ или что-то.это мой код.

    Bitmap bmp = new Bitmap(Width, Height);
            System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(bmp);
            gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            gr.PixelOffsetMode = PixelOffsetMode.HighQuality;

            System.Drawing.Rectangle rectDestination = new System.Drawing.Rectangle(0, 0, Width, Height);
            System.Drawing.Size rs = new System.Drawing.Size();
            rs.Height = Height;
            rs.Width = Width;
            gr.DrawImage(originalImage, new Rectangle(new Point(0, 0), rs), 0, 0,     originalImage.Width, originalImage.Height, GraphicsUnit.Pixel);
            string thumbnailPath = string.Concat(pathToSaveIn, thumbnailName);
            bmp.Save(thumbnailPath);
            gr.Dispose();

Ответы [ 3 ]

3 голосов
/ 24 декабря 2011

Код изменения размера изображения выглядит нормально (на первый взгляд). Однако вы сохраняете изображение в растровом формате без потерь - отсюда и большой размер файла.

Возможно, вы захотите использовать JPEG вместо миниатюры: для фотографий и т. Д. Это дает хорошее сжатие.

Это может помочь:

    public void SaveImage(Bitmap image, string filename)
    {
        long quality = 80L;  // adjust as appropriate

        var qualityEncoder = Encoder.Quality;

        using (var encoderParameter = new EncoderParameter(qualityEncoder, quality))
        using (var encoderParams = new EncoderParameters(1))
        {
            encoderParams.Param[0] = encoderParameter;
            var jpegEncoder = GetEncoder(ImageFormat.Jpeg);
            image.Save(filename, jpegEncoder, encoderParams);
        }
    }

    private static ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

        return codecs
            .Where(codec => codec.FormatID == format.Guid)
            .FirstOrDefault();
    }
0 голосов
/ 24 декабря 2011

Попробуйте System.Drawing.Image.GetThumbnailImage . Я сам этим не пользовался, но похоже, что это может сработать.

0 голосов
/ 24 декабря 2011

Это похоже на .NET.У Скотта Хансельмана была хорошая запись в блоге об этом.По сути, обзор пакета на NuGet, который помогает с этим.

http://www.hanselman.com/blog/NuGetPackageOfWeek11ImageResizerEnablesCleanClearImageResizingInASPNET.aspx

...