quicker 2.2.8 动作执行失败

异常报告 · 15 次浏览
回复内容
方述多云转晴 5天2小时前
#1

Quicker 2.0 下 JPEG(MozJPEG) 压缩失败的原因与修复

症状:2.0 里压缩 jpg 报 执行CS脚本出错:Value cannot be null. (Parameter 'bitmapdata'),1.x 正常。PNG(PngQuant) 那条路不受影响。

真因:2.0 的 C# 脚本运行在 .NET 10 上,P/Invoke 不再搜索"动作文件夹 / 当前目录"。MozJpegWrapper 内部用的是裸文件名 DllImport("turbojpeg_x64.dll"),找不到动作附件目录里的 turbojpeg;包装内部加载失败后又在 finally 里对未赋值的 bitmapdata 调用 UnlockBits,把真正的错误盖成了上面那句。

修复:打开子程序 「图片压缩」→ 步骤「运行C#代码」,在脚本里 public static void Exec(Quicker.Public.IStepContext context){ 这行的下面插入:

C#
// 2.0 修复:按绝对路径预加载原生库,再给包装程序集装一个 DllImport 解析器
NativeLibrary.Load(IntPtr.Size == 8 ? @"{MozJPEG64}" : @"{MozJPEG32}");
try
{
string nativeDir = Path.GetDirectoryName(@"{Wrapper}");
NativeLibrary.SetDllImportResolver(typeof(MozJpeg).Assembly, (name, asm, paths) =>
{
string cand = Path.Combine(nativeDir, name);
return File.Exists(cand) ? NativeLibrary.Load(cand, asm, paths) : NativeLibrary.Load(name, asm, paths);
});
}
catch { }

注意

  1. 其它代码不用动;{MozJPEG64} / {MozJPEG32} / {Wrapper} 保持原样,脚本开头的 $$ 会让 Quicker 在运行时把它们替换成实际路径;不要删脚本第一行的 $$
  2. using System.Runtime.InteropServices; 原脚本已有,无需添加。
  3. 只适用于 Quicker 2.0(.NET 10)。1.x 是 .NET Framework,没有 NativeLibrary,请不要加。

实测:345 KB 的 jpg(质量 98)压缩后 122 KB(质量 80),PNG 行为不变。

回复主贴