将VCF图像导出为JPEG

问题描述 投票:0回答:7

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

在.vcf的源代码中,有一个代码部分是这样开始的:

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

它继续...现在,我想获取这张照片并将其另存为 .JPEG。有什么想法如何做到这一点吗?

谢谢。

export jpeg vcf-vcard
7个回答
11
投票

在 macOS 中,可以轻松使用“vi”和“base64”来执行行命令。

例如,

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

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

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

  1. base64 解码剩余文件

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


7
投票

编码为Base64。网上可以找到解码的工具。

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

photo.jpg


5
投票

您应该使用 vCard 解析器(如 vpim),它能够提供 从 vCard 中提取照片数据


2
投票

因为这不是 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\r" | sed 's/.*TYPE=[^:]*://;s/END:V.*//' | base64 -d > 1.jpg

如果你想要更干净的东西,那么 Matt Brock 的 vCard_photo_extractor.sh 可能就是您正在寻找的。


1
投票

另一个 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
}

0
投票

使用 http://www.sobolsoft.com/convertvcfjpg/ 与 OSX 中的 vCards,成功。


0
投票

这是一个肮脏的 Python 脚本来做到这一点:

#!/usr/bin/env python3

import argparse
import base64

parser = argparse.ArgumentParser('vcard-to-jpeg')
parser.add_argument('-i', '--input', type=argparse.FileType('r'), default='-')
parser.add_argument('-o', '--output', type=argparse.FileType('wb'), default='-')
args = parser.parse_args()

vcard_data = args.input.read()
lines = vcard_data.splitlines()
photo_start = next(idx for idx, line in enumerate(lines) if line.startswith('PHOTO'))
# We split on any whitespace here, not just lines, as these lines are often padded with a space.
# str.split() will transparently take care of that.
photo_lines = '\n'.join(lines[photo_start:]).split()
photo_lines[0] = photo_lines[0].replace('PHOTO;ENCODING=b;TYPE=JPEG:', '')
photo_data = ''.join(photo_lines)

args.output.write(base64.decodebytes(photo_data.encode('utf-8')))
© www.soinside.com 2019 - 2024. All rights reserved.