【问题标题】:Export VCF image to JPEG将 VCF 图像导出为 JPEG
【发布时间】:2013-02-26 00:09:57
【问题描述】:

我使用 iPhone 创建了一个 .vcf 联系人,并通过电子邮件将文件发送给我自己。在那个.vcf中,我拍了一张照片,它直接保存在vCard中,而不是手机内存中。

在.vcf的源码中,有一段这样开头的代码:

PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAA

它还在继续……现在,我想获取这张照片并将其保存为 .JPEG。任何想法如何做到这一点?

谢谢。

【问题讨论】:

    标签: export jpeg vcf-vcard


    【解决方案1】:

    在 macOS 中,可以很容易地从带有“vi”和“base64”的行命令。

    例如,

    导出“Apple Inc.”每个用户帐户附带的联系人。

    1. 使用 vi 手动删除其他行。
    2. 删除该行的标题和元数据

    照片;编码=b;类型=JPEG:

    1. base64 解码剩余文件

    # base64 -D -i Apple\ Inc..vcf -o Apple_Logo.jpeg

    【讨论】:

      【解决方案2】:

      编码为Base64。你可以在网上找到一个解码工具。

      我可以推荐Freeformatter.com 的解码器,它可以让你保存为二进制文件。然后,您需要将该文件重命名为 photo.jpg

      【讨论】:

        【解决方案3】:

        您应该使用提供pull photo data from the vCard 功能的 vCard 解析器(如 vpim)。

        【讨论】:

          【解决方案4】:

          另一个 vCard 解析器是 ez-vcard,它是用 Java 编写的(免责声明:我是作者)。

          File file = new File("vcard.vcf");
          VCard vcard = Ezvcard.parse(file).first();
          for (PhotoType photo : vcard.getPhotos()){
            byte data[] = photo.getData();
            //save byte array to file
          }
          

          【讨论】:

            【解决方案5】:

            因为这不是https://apple.stackexchange.com/,所以我建议使用一个快速的 bash 脚本,该脚本用于在命令行上从 .vcf 文件中提取图像:

            #!/bin/bash
            #vcf_photo_extractor ver 20180207094631 Copyright 2018 alexx, MIT Licence
            if [ ! -f "$1" ]; then
              echo "Usage: $(basename $0) [path/]any/contact.vcf"
              exit 1
            fi
            
            DATA=$(cat "$1" |tr -d "\r\n"|sed -e 's/.*TYPE=//' -e 's/END:VCARD.*//')
            NAME=$(grep -a '^N;' $1|sed -e 's/.*://')
            #if [ $(wc -c <<< $DATA) -lt 5 ];then #bashism
            if [ $(echo $DATA|wc -c) -lt 5 ];then
              echo "No images found in $1"
              exit 2
            fi
            EXT=${DATA%%:*}
            if [ "$EXT" == 'BEGIN' ]; then echo "FAILED to extract $EXT"; exit 3; fi
            IMG=${DATA#*:}
            FILE=${1%.*}
            Fn=${FILE##*/}
            if [ -f "${FILE}.${EXT}" ]; then
              echo "Overwrite ${FILE}.${EXT} ? "
              read -r YN
              if [ "$YN" != 'y' ]; then exit; fi
            fi
            echo $IMG | base64 -id > ${FILE}.${EXT} || \
              echo "Failed to output $NAME to ${FILE}.${EXT}"
            

            此脚本尝试提取 base64 数据,使用 base64 对其进行解码并创建图像文件。我在 linux 上发现 base64 -id 工作但 base64 -d 抛出错误。

            如果您是单行代码或代码高尔夫的粉丝,那么这可能会起作用:

            cat 1.vcf|tr -d "\n"|sed -e 's/.*TYPE=[^:]*://' -e 's/END:V.*//'|base64 -id >1.jpg
            

            如果你想要更干净的东西,那么 Matt Brock 的 vCard_photo_extractor.sh 可能就是你要找的。​​p>

            【讨论】:

            • Matt Brock 的 vCard_Photo_Extractor.sh 为我创建了 0 字节图像,仅供参考。我认为缺少 base64 解码现在需要的选项,我不确定。另外,我不确定选项 -h 选项在 Matt Brock 的脚本中的用途。
            • 使用你的脚本,我还得到了一个零字节文件,有趣的是,输出文件名的扩展名为 .home 输出如下: Unable to open 'd': No such file or directory Failed to输出到 name.Home
            • 单行在 macOS 上失败。在 Debian 或 Ubuntu 上,正确的语法确实是 base64 -id。但是,在 macOS 上,我不得不改用 base64 -D。 (-i 引用输入文件,给出错误“无法打开'd':没有这样的文件或目录”)
            【解决方案6】:

            http://www.sobolsoft.com/convertvcfjpg/ 与 OSX 的 vCard 一起使用,成功。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-12-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多