【问题标题】:Share ImageMagick files over network drive without users installing ImageMagick?在没有用户安装 ImageMagick 的情况下通过网络驱动器共享 ImageMagick 文件?
【发布时间】:2015-05-07 13:30:17
【问题描述】:

是否可以通过网络驱动器(例如:Z:)与其他人共享 ImageMagick 文件,而无需用户安装 ImageMagick?

ImageMagick 在我自己的机器上运行良好,因为我使用了它的二进制安装程序并设置了 Windows 环境变量(“MAGICK_HOME”)。

我尝试使用 Python 自动设置用户的系统环境变量,但即便如此,当用户在命令提示符下键入时:

convert c:\testA.psd c:\testB.png

会报错:

convert.exe:此图像格式“PSD”@error/constitute.c/ReadImage/501 没有解码委托。

convert.exe: 没有定义图像 'c:\testB.png' @error/convert.c/ConvertImageCommand/3212。

及相关错误如:

RegistryKeyLookupFailed 'CoderModulesPath'

注意

  • 系统:Windows 7,64 位
  • ImageMagick 版本:6.9.0-Q8
  • ImageMagick 文件夹包含许多文件,包括 CORE_RL_*.dll, dcraw.exe、ffmpeg.exe、convert.exe、compare.exe等和“模块” 文件夹

参考 #1

http://www.imagemagick.org/discourse-server/viewtopic.php?t=20599

一些有助于调试 IM 的命令。我用过

convert -list format

它返回一个空列表。所以现在我确定用户的 IM 没有正确安装。

参考 #2

Packaging an application that uses the ImageMagick C API

我正在寻找更多关于“手动安装 ImageMagick”(不是通过二进制安装程序)的答案,因此我可以确切地知道我必须通过 Python 配置哪些 Windows 设置。然后上面的链接(由 Alex 发布)显示了我想要的。现在我意识到我没有配置环境变量“CoderModulesPath”。现在我要试一试...

【问题讨论】:

  • 你的意思是二进制文件,比如显示,识别,从imagemagick转换?
  • 是的,整个 ImageMagick 文件夹包含 imdisplay.exe、identify.exe、convert.exe 以及所有这些 DLL、模块文件夹等。

标签: python imagemagick installation


【解决方案1】:

找了很久……终于找到了解决办法:

如果您想与其他用户共享您的 ImageMagick 文件夹和文件 - 为他们省去安装的麻烦或出于其他原因 - 请务必以编程方式配置其系统的环境变量:

  1. "MAGICK_HOME" = [ImageMagick 文件夹的路径]

    例如。 z:\ImageMagick-6.9.0-Q8

  2. "MAGICK_CODER_MODULE_PATH" = [ImageMagick 文件夹的路径]\modules\coders

    例如。 z:\ImageMagick-6.9.0-Q8\modules\coders

...modules\coders文件夹中,有处理不同类型图片文件的DLL,如果不指定这个路径,IM找不到“decode delegate”

设置环境变量后,您可能需要通知用户重新启动机器以使变量生效。

兼容性

如果您使用 API 来访问这个 ImageMagick 库(例如 Python wand),那么这可能是一个不错的选择。 ImageMagick 的便携版可能不兼容,因为文件结构与非便携版不同。

资源

检索和修改 Windows 注册表项和值的 Python 类:

参考:http://code.activestate.com/recipes/577621-manage-environment-variables-on-windows/

if sys.hexversion > 0x03000000:
    import winreg
else:
    import _winreg as winreg

class Win32Environment:
    # Utility class to get/set windows environment variable
    def __init__(self, scope):
        assert scope in ('user', 'system')
        self.scope = scope
        if scope == 'user':
            self.root = winreg.HKEY_CURRENT_USER
            self.subkey = 'Environment'
        else:
            self.root = winreg.HKEY_LOCAL_MACHINE
            self.subkey = r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'

    def getenv(self, name):
        key = winreg.OpenKey(self.root, self.subkey, 0, winreg.KEY_READ)
        try:
            value, _ = winreg.QueryValueEx(key, name)
        except WindowsError:
            value = ''
        winreg.CloseKey(key)
        return value

    def setenv(self, name, value):
        # Note: for 'system' scope, you must run this as Administrator
        key = winreg.OpenKey(self.root, self.subkey, 0, winreg.KEY_ALL_ACCESS)
        winreg.SetValueEx(key, name, 0, winreg.REG_EXPAND_SZ, value)
        winreg.CloseKey(key)

【讨论】:

  • 这是一个可行的解决方案,代价是修改用户的机器设置,这毕竟是安装的意义所在。不过干得好。
  • 谢谢塔里克!便携版肯定很有用,我希望他们能不断更新它,使其与许多现有的 IM API 更加兼容,虽然我现在不知道这怎么可能。
【解决方案2】:

实现这一目标的最佳机会是共享 ImageMagick 的便携版本。在 Google 上查找 ImageMagick 便携版,下载文件并将它们共享。

【讨论】:

  • 谢谢!!没想到会有便携版!也会尝试一下:)
  • ftp.imagemagick.org/pub/ImageMagick/binaries 查找该 ZIP。这是16位门户版本。虽然我找不到任何 8 位版本:/
  • 16 位的不行吗?
  • 谢谢!!它完成了工作:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多