我有100个(也许1000个)的产品,每个产品的10-30张图片出现在我放在一起的网上商店里。我需要在不损失图像质量的情况下尽可能优化图像的文件大小。
我没有直接使用jpegtran、jpegoptim或任何其他jpeg优化器,但我注意到,在较大的jpeg图像LOSSLESSLY上,punypng可以将文件大小缩小约4-6%。
元数据已经在上传过程中从图像中剥离(通过jumpoader),所以这不再是一个选项/问题。
有没有办法让一个jpeg优化器从C#代码中运行?
注意:我正在使用IIS7和.Net 3.5的共享主机
发布于 2016-07-19 09:04:18
这可能太晚了7年,但我在试图解决这个问题时遇到了这个问题。我最终做到了这一点,这就是解决方案。对于PNG,您首先需要使用NuGet安装nQuant。
包括:
using System.Web.Hosting;
using System.IO;
using System.Diagnostics;
using nQuant;
using System.Drawing;
using System.Drawing.Imaging;
方法:
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部分我是从几个来源搜集来的。包括PicJam和Image Optimizer。我使用它的方式是将用户的所有文件上传到temp文件夹,运行此方法,将文件上传到azure blob存储,并删除本地文件。我下载了jpegtran here。
发布于 2009-10-12 18:35:26
如果你不喜欢处理临时文件,我建议你使用C++/CLI。
在visual studio中创建一个C++/CLI dll项目。创建一个静态托管类,并根据需要在C#中定义函数:
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++代码进行了单元测试。
祝好运!
发布于 2009-10-12 11:33:51
我会在上传到你的web服务器之前批量处理图像,而不是在服务它们的同时尝试处理它们。这将减少web服务器上的负载,并允许您使用任何想要的匹配图像处理工具。
https://stackoverflow.com/questions/1493532
复制相似问题