c# Как изменить размер любого изображения, указав c килобайт при сохранении типа изображения - PullRequest
0 голосов
/ 16 апреля 2020

Я видел тонну статей о переполнении стека для уменьшения размера изображения, но ни одна из них не поддерживает исходный тип изображения (или я так нашел). У них обычно есть шаги по уменьшению размеров в пикселях, снижению качества изображения и преобразованию в определенный тип изображения c (обычно в JPEG).

У меня есть группа изображений, размер которых мне нужно изменить. Они имеют различные типы изображений, и все имена файлов хранятся в базе данных, что делает преобразование из одного типа изображения в другой несколько проблематичным c. Я не могу просто изменить имя файла с png на jpg, потому что тогда база данных не будет указывать на реальный файл.

У кого-нибудь есть пример того, как изменить размер / уменьшить изображения до «256 килобайт» и сохранить исходный тип изображения?

Например, вот код, с которым я в данный момент работаю.

public static byte[] ResizeImageFile(Image oldImage, int targetSize) // Set targetSize to 1024
    {
        Size newSize = CalculateDimensions(oldImage.Size, targetSize);
        using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb))
        {
            using (Graphics canvas = Graphics.FromImage(newImage))
            {
                canvas.SmoothingMode = SmoothingMode.AntiAlias;
                canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
                canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
                canvas.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize));
                MemoryStream m = new MemoryStream();
                newImage.Save(m, ImageFormat.Jpeg);
                return m.GetBuffer();
            }
        }
    }

Может быть, есть способ, которым я могу сначала получить файл fileinfo или mime type, а затем включить. Сохранить тип изображения?

1 Ответ

0 голосов
/ 16 апреля 2020

Вот то, что я придумал (основываясь на некоторых примерах, которые я нашел в Интернете, которые не были завершены на 100%.

private void EnsureImageRequirements(string filePath)
    {
        try
        {
            if (File.Exists(filePath))
            {
                // If images are larger than 300 kilobytes
                FileInfo fInfo = new FileInfo(filePath);
                if (fInfo.Length > 300000)
                {
                    Image oldImage = Image.FromFile(filePath);

                    ImageFormat originalFormat = oldImage.RawFormat;

                    // manipulate the image / Resize
                    Image tempImage = RefactorImage(oldImage, 1200); ;

                    // Dispose before deleting the file
                    oldImage.Dispose();

                    // Delete the existing file and copy the image to it
                    File.Delete(filePath);

                    // Ensure encoding quality is set to an acceptable level
                    ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();

                    // Set encoder to fifty percent compression
                    EncoderParameters eps = new EncoderParameters
                    {
                        Param = { [0] = new EncoderParameter(Encoder.Quality, 50L) }
                    };

                    ImageCodecInfo ici = (from codec in encoders where codec.FormatID == originalFormat.Guid select codec).FirstOrDefault();

                    // Save the reformatted image and use original file format (jpeg / png / etc) and encoding
                    tempImage.Save(filePath, ici, eps);

                    // Clean up RAM
                    tempImage.Dispose();
                }

            }
        }
        catch (Exception ex)
        {
            this._logger.Error("Could not resize oversized image " + filePath, ex);
        }

    }

    private static Image RefactorImage(Image imgToResize, int maxPixels)
    {
        int sourceWidth = imgToResize.Width;
        int sourceHeight = imgToResize.Height;

        int destWidth = sourceWidth;
        int destHeight = sourceHeight;

        // Resize if needed
        if (sourceWidth > maxPixels || sourceHeight > maxPixels)
        {
            float thePercent = 0;
            float thePercentW = 0;
            float thePercentH = 0;

            thePercentW = maxPixels / (float) sourceWidth;
            thePercentH = maxPixels / (float) sourceHeight;

            if (thePercentH < thePercentW)
            {
                thePercent = thePercentH;
            }
            else
            {
                thePercent = thePercentW;
            }

            destWidth = (int)(sourceWidth * thePercent);
            destHeight = (int)(sourceHeight * thePercent);
        }

        Bitmap tmpImage = new Bitmap(destWidth, destHeight, PixelFormat.Format24bppRgb);

        Graphics g = Graphics.FromImage(tmpImage);
        g.InterpolationMode = InterpolationMode.HighQualityBilinear;

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

        return tmpImage;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...