Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 图像压缩不起作用_C#_Image Compression - Fatal编程技术网

C# 图像压缩不起作用

C# 图像压缩不起作用,c#,image-compression,C#,Image Compression,我在网站上做了一个操作,截取了一个图像,但是结果是,截取的图像在文件大小方面要大得多(原始图像是24k,截取的图像是650k)。所以我发现在保存之前我需要对图像进行一些压缩。我得出了以下结论: public static System.Drawing.Image CropImage(System.Drawing.Image image, Rectangle cropRectangle, ImageFormat format) { var croppedImage = new Bitmap

我在网站上做了一个操作,截取了一个图像,但是结果是,截取的图像在文件大小方面要大得多(原始图像是24k,截取的图像是650k)。所以我发现在保存之前我需要对图像进行一些压缩。我得出了以下结论:

public static System.Drawing.Image CropImage(System.Drawing.Image image, Rectangle cropRectangle, ImageFormat format)
{
    var croppedImage = new Bitmap(cropRectangle.Width, cropRectangle.Height);
    using (var g = Graphics.FromImage(croppedImage))
    {
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.DrawImage(
            image, 
            new Rectangle(new Point(0,0), new Size(cropRectangle.Width, cropRectangle.Height)), 
            cropRectangle, 
            GraphicsUnit.Pixel); 
        return CompressImage(croppedImage, format);
    }
}

public static System.Drawing.Image CompressImage(System.Drawing.Image image, ImageFormat imageFormat)
{
    var bmp = new Bitmap(image);
    var codecInfo = EncoderFactory.GetEncoderInfo(imageFormat);
    var encoder = System.Drawing.Imaging.Encoder.Quality;
    var parameters = new EncoderParameters(1);
    var parameter = new EncoderParameter(encoder, 10L);
    parameters.Param[0] = parameter;

    using (var ms = new MemoryStream())
    {
        bmp.Save(ms, codecInfo, parameters);
        var resultImage = System.Drawing.Image.FromStream(ms);
        return resultImage;
    }
}
我把质量设置得很低,只是想看看是否有任何变化。没有。从外观上看,作物被正确保存,但压缩是一件不愉快的事情。如果我完全忽略CompressImage(),则文件大小和图像质量都不会有任何不同


所以,有两个问题。为什么什么都没发生?是否有一种更简单的方法将合成图像压缩为“web优化”,类似于photoshop保存web图像的方式(我认为它只是从中剥离了大量信息以减小大小)。

您的问题是必须在保存图像时“压缩”(真正编码)图像,而不是在保存之前。程序中的图像对象始终未压缩

通过保存到MemoryStream并从流中读取,将对图像进行编码,然后再次将其解码回相同大小(如果使用JPEG,则在解码过程中会有一些质量损失)。然而,若您将其保存到带有压缩参数的文件中,您将得到一个压缩的图像文件

在153 KB的源图像上使用JPEG质量等级为90的此例程,输出图像为102 KB。如果您想要更小的文件大小(具有更多编码工件),请将编码器参数更改为小于90的值

public static void SaveJpegImage(System.Drawing.Image image, string fileName)
{
    ImageCodecInfo codecInfo = ImageCodecInfo.GetImageEncoders()
        .Where(r => r.CodecName.ToUpperInvariant().Contains("JPEG"))
        .Select(r => r).FirstOrDefault();

    var encoder = System.Drawing.Imaging.Encoder.Quality;
    var parameters = new EncoderParameters(1);
    var parameter = new EncoderParameter(encoder, 90L);
    parameters.Param[0] = parameter;

    using (FileStream fs = new FileStream(fileName, FileMode.Create))
    {
        image.Save(fs, codecInfo, parameters);
    }
}

我认为,当您使用使用引用该流的image.FromStream创建的映像时,不应该处理MemoryStream。直接从流创建位图也不起作用

试试这个:

private static Image CropAndCompressImage(Image image, Rectangle rectangle, ImageFormat imageFormat)
{
    using(Bitmap bitmap = new Bitmap(image))
    {
        using(Bitmap cropped = bitmap.Clone(rectangle, bitmap.PixelFormat))
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                cropped.Save(memoryStream, imageFormat);
                return new Bitmap(Image.FromStream(memoryStream));
            }
        }
    }
}

您正在读取并保存什么图像格式?BMP几乎不压缩。PNG或JPG压缩效果更好。我可以很容易地想象从24k PNG到650k BMP的giong。我用PNG/jpg阅读。位图只是一个中间对象问题不是你在读什么。。。你在储蓄什么。请检查Condencinfo和paramets对象的正确设置…可能您保存的图像质量比原始图像高…因此,在我的特定实现中,图像永远不会保存到磁盘。图像被保存为数据库中的二进制信息,然后直接读取回网页(MVC FileResult)。如何压缩图像并保存字节?如果我将数据库中的压缩字节读入一个图像(中间),根据你所说的,它会重新膨胀大小。这实际上与我目前拥有的相同,唯一的区别是我在返回图像之前将其读入一个
图像中。我试着省略这一部分并从MemoryStream中返回字节数组,但结果是一样的——原始文件为24k时,该文件为600k。不确定这有多理想,但我有一个应用程序正在生产中,可以将图像保存到Oracle Blob中。在您的示例中,在将位图保存到内存流之后,立即从该流中获取原始btyes:'byte[]imageBytes=ms.ToArray();`并将字节数组存储在数据库中。您可以使用不同的编码-当您从数据库中读回它时,它与您读取文件时一样。读取到字节数组-注意它是jpg或png,还不是图像对象。您需要从字节[]创建一个流并加载它以获得一个图像。只是重申一下,将内存流读回图像会将图像从其他格式(jpg、png、tiff)解码回位图-您正在将图像膨胀回其原始大小。好的,我让它工作了。起初,看起来我在所有正确的地方都正确地保存了字节,但我尝试使用
Image
作为中间对象,我认为有几个地方我是曲折的,而不是曲折的。我尽可能地消除了
图像
,并试图单独使用
字节[]
,它似乎已经清除了它。谢谢你的耐心:)