首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C#中使用jpegtran、jpegoptim或其他jpeg优化/压缩

在C#中使用jpegtran、jpegoptim或其他jpeg优化/压缩
EN

Stack Overflow用户
提问于 2009-09-29 16:09:20
回答 5查看 6.3K关注 0票数 4

我有100个(也许1000个)的产品,每个产品的10-30张图片出现在我放在一起的网上商店里。我需要在不损失图像质量的情况下尽可能优化图像的文件大小。

我没有直接使用jpegtran、jpegoptim或任何其他jpeg优化器,但我注意到,在较大的jpeg图像LOSSLESSLY上,punypng可以将文件大小缩小约4-6%。

元数据已经在上传过程中从图像中剥离(通过jumpoader),所以这不再是一个选项/问题。

有没有办法让一个jpeg优化器从C#代码中运行?

注意:我正在使用IIS7和.Net 3.5的共享主机

EN

回答 5

Stack Overflow用户

发布于 2016-07-19 09:04:18

这可能太晚了7年,但我在试图解决这个问题时遇到了这个问题。我最终做到了这一点,这就是解决方案。对于PNG,您首先需要使用NuGet安装nQuant。

包括:

代码语言:javascript
运行
复制
using System.Web.Hosting;
using System.IO;
using System.Diagnostics;
using nQuant;
using System.Drawing;
using System.Drawing.Imaging;

方法:

代码语言:javascript
运行
复制
    public void optimizeImages()
    {
        string folder = 
            Path.Combine(HostingEnvironment.ApplicationPhysicalPath, @"assets\temp");
        var files = Directory.EnumerateFiles(folder);

        foreach (var file in files)
        {
            switch (Path.GetExtension(file).ToLower())
            {
                case ".jpg":
                case ".jpeg":
                    optimizeJPEG(file);
                    break;
                case ".png":
                    optimizePNG(file);
                    break;
            }

        }

    }

    private void optimizeJPEG(string file)
    {
        string pathToExe = HostingEnvironment.MapPath("~\\adminassets\\exe\\") + "jpegtran.exe";

        var proc = new Process
        {
            StartInfo =
            {
                Arguments = "-optimize \"" + file + "\" \"" + file + "\"",
                FileName = pathToExe,
                UseShellExecute = false,
                CreateNoWindow = false,
                WindowStyle = ProcessWindowStyle.Hidden,
                RedirectStandardError = true,
                RedirectStandardOutput = true
            }
        };

        Process jpegTranProcess = proc;

        jpegTranProcess.Start();
        jpegTranProcess.WaitForExit();
    }

    private void optimizePNG(string file)
    {
        string tempFile = Path.GetDirectoryName(file) + @"\temp-" + Path.GetFileName(file);
        int alphaTransparency = 10;
        int alphaFader = 70;
        var quantizer = new WuQuantizer();
        using (var bitmap = new Bitmap(file))
        {
            using (var quantized = quantizer.QuantizeImage(bitmap, alphaTransparency, alphaFader))
            {
                quantized.Save(tempFile, ImageFormat.Png);

            }

        }
        System.IO.File.Delete(file);
        System.IO.File.Move(tempFile, file);
    }

它将获取/assets/temp文件夹中的所有文件,并优化jpegs和PNG。我跟随this question完成了png部分。jpeg部分我是从几个来源搜集来的。包括PicJamImage Optimizer。我使用它的方式是将用户的所有文件上传到temp文件夹,运行此方法,将文件上传到azure blob存储,并删除本地文件。我下载了jpegtran here

票数 3
EN

Stack Overflow用户

发布于 2009-10-12 18:35:26

如果你不喜欢处理临时文件,我建议你使用C++/CLI。

在visual studio中创建一个C++/CLI dll项目。创建一个静态托管类,并根据需要在C#中定义函数:

代码语言:javascript
运行
复制
public ref class JpegTools
{
public:
     static array<byte>^ Optimize(array<byte>^ input)
};

您定义的这些函数可以直接从C#调用,并且可以使用C++提供的所有功能来实现它们。

array^对应于一个C#字节数组。您需要使用pin_ptr<>将字节数组固定在内存中,这样就可以将数据传递给您选择的非托管Jpeg helper函数。C++/CLI对将托管类型封送处理为本机类型提供了充分的支持。您还可以使用gc_new分配新的数组,以返回与CLI兼容的类型。作为本练习的一部分,如果必须将字符串从C#编组到C++,请使用Mfc/Atl的CString类型。

您可以将所有jpeg代码静态链接到dll中。CLI可以是纯本机代码和C++ /C++代码的混合。在我们的C++/CLI项目中,通常只有接口源文件知道CLI类型,其余的都与C++类型一起工作。

这样做会带来一些开销,但好处是您的代码是编译时类型检查的,所有与未管理代码和内存的处理都在C++端处理。它实际上工作得非常好,以至于我使用C++/CLI几乎直接用NUnit对原生C++代码进行了单元测试。

祝好运!

票数 2
EN

Stack Overflow用户

发布于 2009-10-12 11:33:51

我会在上传到你的web服务器之前批量处理图像,而不是在服务它们的同时尝试处理它们。这将减少web服务器上的负载,并允许您使用任何想要的匹配图像处理工具。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1493532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档