在Python中使用imagemagick下载、写入、转换和保存(图像损坏)

0 投票
1 回答
547 浏览
提问于 2025-04-18 13:51

好的,我已经尝试解决这个问题大约六个小时了,但就是没能搞定。

我有一个函数,它会根据时间戳从一个网址抓取一堆图片(GIF文件),使用的是Requests库。这些图片会被保存到我桌面上的一个特定文件夹里,保存得很好。可是,当我尝试打开这些图片、重命名并处理它们的时候,一切就崩溃了。

这是最初设置一切的函数:

def createImage():

    AB_CODES = ["WHK", "WHN", "WWW", "XBU", "XSM"]
    BASE_URL = "http://url_where_I_get_images_from"

    orig_dir = "originals/"
    new_dir = "processed/"

    # Add new image for each code
    for code in AB_CODES:
        radar_dir = BASE_URL + code
        url = requests.head(radar_dir)

        #parseUrl creates a valid timestamp corresponding to the latest image.
        timestamp = parseUrl(url)

        filename = timestamp + "_" + code + "_PRECIP_RAIN.gif"
        radar = BASE_URL + code + "/" + filename
        radar_img = requests.get(radar, timeout=30.000)

        # This is where the file from original source gets saved to my desktop, works.
        # Image gets saved in path/originals/img.gif
        if (radar_img.status_code == requests.codes.ok):
            image = radar_img.content
            filepath = os.path.join(orig_dir, filename)
            imgfile = open(filepath, "wb")
            imgfile.write(image)
            imgfile.close()

            # This is where I create a new image to be saved and worked on in
            # path/processed/new_img.gif
            image = radar_img.content
            filename = code + "_radar.gif"
            convpath = os.path.join(new_dir, filename)
            convimg = open(convpath, "wb")
            convimg.write(image)
            # This is the call to the function where I use imagemagick
            # which is not working
            image = processImage(convimg.name, "processed/XSM_radar_output.gif")
            convimg.close()

这里是构成我处理函数的两个方法。现在它还处于测试阶段,因为它根本不工作。

def formatArg(arg):
    if arg.startswith("#") or " " in arg:
        return repr(arg)
    return arg

def processImage(input, output, verbose=True, shell=True):
    args = [
        "convert", input, 
        "-resize", "50x50", 
        output
    ]

    if verbose:
        print("Image: %s" % input)
        print(" ".join(formatArg(a) for a in args))
        print
    if os.path.exists(input):
        try:
            result = subprocess.check_call(args)
        except subprocess.CalledProcessError:
            result = False

        if result:
            print("%s : SUCCESS!" % output)
        else:
            print("%s : FAIL!" % output)

我试过不使用shell=true。出现的错误信息是图片损坏:

Image: processed/XSM_radar.gif
convert processed/XSM_radar.gif -resize 50x50 processed/XSM_radar.gif
convert.im6: corrupt image `processed/XSM_radar.gif' @ error/gif.c/ReadGIFImage/1356.
convert.im6: no images defined `processed/XSM_radar_output.gif' @    error/convert.c/ConvertImageCommand/3044.
processed/XSM_radar.gif : FAIL!

我不明白为什么会告诉我图片损坏。我在命令行中运行这些完全相同的命令时,一切都正常。(我已经导入了subprocess)

1 个回答

0

有人帮我找到了错误。

def processImage(input, output, verbose=True, shell=True):
    args = [
        "convert", input, 
        "-resize", "50x50", 
        output
    ]

if verbose:
    print("Image: %s" % input)
    print(" ".join(formatArg(a) for a in args))
    print
if os.path.exists(input):
    try:
        **result = subprocess.check_call(args)**
    **except subprocess.CalledProcessError:**
        **result = False**
    **if result:**
        print("%s : SUCCESS!" % output)
    else:
        print("%s : FAIL!" % output)

那部分结果应该是

result_code = subprocess.check_call(args)

如果返回了错误,result_code 应该被设置为 1。

所以:

if result_code == 0:
    do stuff

谢谢你的关注!祝你有美好的一天。

撰写回答