我想在我的Android项目中使用用C++编写的exiv2库.为此,我尝试使用Android NDK交叉编译库.
对于交叉编译,我遵循以下步骤:
将ndk路径添加到变量PATH
$ PATH="/home/patrycja/android-packages/ndk:${PATH}"
$ export PATH
Run Code Online (Sandbox Code Playgroud)安装标准工具链,用于交叉编译适用于Android的C/C++.
./make-standalone-toolchain.sh --platform=android-21 --install-dir=/tmp/my-android-toolchain --ndk-dir='/home/patrycja/android-packages/ndk/' --toolchain=arm-linux-androideabi-4.9 --system=linux-x86_64
Copying prebuilt binaries...
Copying sysroot headers and libraries...
Copying c++ runtime headers and libraries...
Copying files to: /tmp/my-android-toolchain
Cleaning up...
Done.
Run Code Online (Sandbox Code Playgroud)设置一些环境变量,以便配置和构建过程将使用正确的编译器.
$ export PATH=/tmp/my-android-toolchain/bin:$PATH
$ export CC="arm-linux-androideabi-gcc"
$ export CXX="arm-linux-androideabi-g++"
$ export CFLAGS='-mthumb -O2'
$ export CXXFLAGS='-mthumb -O2'
$ export LDFLAGS='-Wl,--fix-cortex-a8'
$ export LIBS='-lstdc++ -lsupc++'
Run Code Online (Sandbox Code Playgroud)Bulid静态库和足够的标头
./configure --prefix=$(pwd)/build --host=arm-linux-androideabi --disable-shared --disable-xmp --disable-nls
Run Code Online (Sandbox Code Playgroud)结果我创建了'build'类别文件:
??? bin
? ??? exiv2
??? include
? ??? exiv2 …Run Code Online (Sandbox Code Playgroud) 我刚刚为我的debian machiene编译了exiv2和gexiv2,现在我想开始使用gexiv2来编译使用python的IPTC数据.gexiv2网站提供以下代码:
from gi.repository import GExiv2
Run Code Online (Sandbox Code Playgroud)
但这已经导致:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named gi.repository
Run Code Online (Sandbox Code Playgroud)
我甚至不能导入gi所以我想我错过了另一个包!?我该怎么做才能使这项工作符合预期?
更新:我将操作系统升级到最新的debian版本.我现在可以导入gi,但是我仍然遇到GExiv2的问题.
导入GExiv2时发生以下错误:
>>>from gi.repository import GExiv2
ERROR:root:Could not find any typelib for GExiv2
Run Code Online (Sandbox Code Playgroud) 我一直试图了解XMP元数据在过去几个小时内如何处理PNG文件,但无法完全理解它.
如果我用Photoshop创建一个PNG图像,保存并打开文件信息对话框(文件>文件信息或Ctrl + Alt + Shift + I),我可以看到一些XMP属性,如CreateDate,CreatorTool或ModifyDate.
现在如果我尝试用exiv2打开文件并读取元数据,它似乎找不到任何东西:
auto image = Exiv2::ImageFactory::open(imagePath);
image->readMetadata();
Exiv2::XmpData &xmpData = image->xmpData();
Run Code Online (Sandbox Code Playgroud)
同样的exiftool -xmp:all myImage.png,exiv2 -P X myImage.png甚至是GIMP(但我认为它在内部使用exiv2).
如果在使用Photoshop再次保存时未删除任何添加的元数据,则不会出现此问题.如果不清楚,打开图像并使用exiv2添加XMP元数据,保存它,在Photoshop和文件信息对话框中打开图像,之前添加的属性不再存在.
奇怪的是,如果你使用JPEG图像完成整个过程,一切都按预期工作:所有属性都可以从Photoshop和exiv2中看到,如果我尝试使用exiv2添加元数据(使用相同的代码),它会出现在Photoshop也是如此.
我错过了一些明显的东西吗 PNG有什么特别的东西不适合JPEG吗?我没有尝试使用Adobe的SDK来编辑XMP数据,这样更好吗?
任何帮助都会非常感激,因为这开始让我发疯:/
编辑:阅读这篇文章后,我尝试使用Adobe Bridge,它似乎没有显示与Photoshop相同的属性.如果我使用Exiv2添加XMP元数据,它们将显示在Bridge中,但如果我在Photoshop中修改图像,则元数据将再次从Bridge中删除.
我安装了这个库:
sudo apt-get install libexiv2-dev libgexiv2-2 gir1.2-gexiv2-0.4
Run Code Online (Sandbox Code Playgroud)
我能够加载Python模块:
from gi.repository import GExiv2
Run Code Online (Sandbox Code Playgroud)
问题来自virtualenv.我需要在virtualenv中使用这个库,我不知道如何安装它,因为没有pip这个包.
我试图在系统范围内安装的库和virtualenv lib文件夹之间建立一个符号链接,但没有结果:
lrwxrwxrwx 1 dnavarro dnavarro 25 jul 4 15:42 girepository-1.0 -> /usr/lib/girepository-1.0
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
无论如何(命令行工具)是否可以计算 .NEF(还有 .CR2、.TIFF)的 MD5 哈希,而不管任何元数据,例如 EXIF、IPTC、XMP 等等?
一旦我们更新了图像文件中的任何元数据,MD5 哈希值应该相同。
我搜索了一段时间,最接近的解决方案是:
exiftool test.nef -all= -o - -m | md5
Run Code Online (Sandbox Code Playgroud)
但是 'exiftool -all=' 仍然在输出文件中保留一组 EXIF 标签。如果我更新剩余的标签,可以更改 MD5 哈希值。
我在Linux上使用Exiv2命令行工具来编辑图像元数据,如下所示:
exiv2 -M"set Iptc.Application2.Caption String This is my caption....." modify IMG.jpg
Run Code Online (Sandbox Code Playgroud)
我想使用用户提供的标题从PHP执行此操作。如果用户不输入任何特殊字符,这将起作用:
exec('/usr/local/bin/exiv2 -M"set Iptc.Application2.Caption String '.$caption.'" modify IMG.jpg');
Run Code Online (Sandbox Code Playgroud)
我需要允许用户使用特殊字符,例如单引号和双引号。我想使用escapeshellcmd()来防止恶意数据。我如何正确地转义命令和参数,以便其起作用?我尝试了很多选择,但我做对了。