2016-06-07 231 views
0

我想用mogrify(GraphicsMagicks)压缩JPG,我需要将结果存储在一个变量中。将shell输出保存到变量

$compressed_jpg_content = shell_exec("gm mogrify -quality 85 - < ".escapeshellarg($image_path)." $filename.jpg"); 
    if (!$compressed_jpg_content) { 
     throw new Exception("Conversion to compressed JPG failed"); 
    } 

但是它不工作,我也得到Conversion to compressed JPG failed,我认为这是我的命令

编辑

由于艾伦·巴特勒

在这种情况下$image_path问题实际上是POST变量,$filenameI4tWX0HI.jpg

错误:gm mogrify: Unable to open file (I4tWX0HI.jpg)

的错误是因为I4tWX0HI.jpg很明显不存在yet.That虽这么说,我怎么能修改命令让它把内容在变,而不是试图打开一个文件

Regards

+1

你可以试着在后面加上'2>&1'到命令结束标准错误转换到标准输出和回声出'compressed_jpg_content'看到d的错误ebugging。尝试'$ compressed_jpg_content = shell_exec(“gm mogrify -quality 85 - <.escapeshellarg($ image_path)。”$ filename.jpg 2> &1"); echo $ compressed_jpg_content;' –

+0

@AllenButler检查编辑 – user2650277

回答

2

根据gm mogrify手册,如果用新映像覆盖原始文件,所以无法在命令行中指定目标映像。

你可以尝试以下选项之一:

1)希望,如果从STDIN mogrify准备好了,它会输出到标准输出。无法测试它,所以它是一个客人。你会发现,你跳过输出文件在这种情况下:

$compressed_jpg_content = shell_exec("gm mogrify -quality 85 - < ".escapeshellarg($image_path)); 

二)让mogrify改变图像(忽略你的文件名),之后读取图像数据:

$compressed_jpg_content = shell_exec("gm mogrify -quality 85 ".escapeshellarg($image_path)." && cat ".escapeshellarg($image_path)); 

C)如果你不想改变原来的文件,将其复制之前:

$tmpfile = tempnam(sys_get_temp_dir(), "image_"); 
copy($image, $tmpfile); 
shell_exec("gm mogrify -quality 85 ".escapeshellarg(tmpfile)); 
$compressed_jpg_content = file_get_contents($tmpfile); 
unlink($tmpfile); 
+0

选项b工作正常。该命令如果'$ image_path'是一个BMP,并且我想将它转换为jpg,请更改 – user2650277

+1

您必须使用-format选项将其设置为jpg。然后,Mogrify将输出到.bmp文件扩展名所替换的相同文件名。 JPG。 –