c#如何在保留图像类型的同时将任何图像调整为特定的千字节大小

问题描述 投票:0回答:1

我见过很多关于减少图像大小的stackoverflow文章,但是它们都不保留原始图像类型(或者我发现了)。它们通常具有减小像素尺寸,降低图像质量以及转换为特定类型的图像(通常为jpeg)的步骤。

我有一组需要调整大小的图像。它们具有各种图像类型,文件名都存储在数据库中,这使得从一种图像类型转换为另一种图像类型有些麻烦。我不能只是将文件名从png更改为jpg,因为那样数据库就不会指向实际文件。

没有人有一个如何将图像调整为256 KB并保持原始图像类型的示例吗?

例如,这是我目前正在使用的代码。

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类型,然后打开.Save作为图像类型?

c# image image-resizing
1个回答
0
投票

这是我想出的(基于我在网上发现的一些例子,它们还没有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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.