我在读取某些图像的IPTC数据时遇到了一些麻烦,我之所以要这样做,是因为我的客户已经在IPTC数据中包含了所有关键字,并且不想在现场。
因此,我创建了一个简单的脚本来读取它们:
$size = getimagesize($image, $info);
if(isset($info['APP13'])) {
$iptc = iptcparse($info['APP13']);
print '<pre>';
var_dump($iptc['2#025']);
print '</pre>';
}
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,这种方法效果很好,但是在处理某些图像时遇到了麻烦。
注意:未定义索引:2#025
虽然我可以在Photoshop中清楚地看到关键字。
是否有任何体面的小型图书馆可以读取每张图片中的关键字?还是我在这里做错了什么?
我正在创建一个照片编辑应用程序,到目前为止,我已成功地从图像文件中读取元数据(在得到这个问题的答案之后:在OS X上打开NSImage时从EXIF读取相机数据).
source = CGImageSourceCreateWithURL((__bridge CFURLRef)url, NULL);
NSDictionary *props = (__bridge_transfer NSDictionary *) CGImageSourceCopyPropertiesAtIndex(source, 0, NULL);
Run Code Online (Sandbox Code Playgroud)
这会将图像文件的所有元数据复制到字典中,并且它可以很好地工作.但是,我无法找到如何将此元数据写回新创建的NSImage
(或图像文件).以下是我保存文件的方法(其中img
是没有元数据的NSImage实例,self.cachedMetadata
是从初始图像读取的字典):
NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:[img TIFFRepresentation]];
[rep setProperty:NSImageEXIFData withValue:self.cachedMetadata];
NSData *data;
if([[fileName lowercaseString] rangeOfString:@".png"].location != NSNotFound){
data = [rep representationUsingType:NSPNGFileType properties:nil];
}else if([[fileName lowercaseString] rangeOfString:@".tif"].location != NSNotFound){
data = [rep representationUsingType:NSTIFFFileType properties:nil];
}else{ //assume jpeg
data = [rep representationUsingType:NSJPEGFileType properties:@{NSImageCompressionFactor: [NSNumber numberWithFloat:1], NSImageEXIFData: self.cachedMetadata}];
}
[data writeToFile:fileName atomically:YES];
Run Code Online (Sandbox Code Playgroud)
我该如何编写元数据?我以前只为JPEG编写了EXIF(字典只是以前的EXIF),但由于EXIF缺少初始图像所具有的一些字段(IPTC和TIFF标签),我需要更改我的阅读方法.现在我拥有所有数据,但我不知道如何将其写入新创建的图像文件.
谢谢,可以.
是否有结束 exif / end-of-xmp / end-of-iptc / start-of-data 标记,我可以用它来获取 jpg/jpeg(和其他图像格式)的数据部分的校验和?
我有兴趣在字节级别手动将IPTC字段注入JPG文件.JPEG文件具有多个具有可观大小标记的元数据段.IPTC的细分容器是:
App13 - 以.开头FF ED XX XX ..
8BIM IPTC文本元数据 - 以38 42 49 4D 04 04 00 00 00 00 XX XX ..
IPTC字段以1C 02 50 XX XX ..
(0x50 = 80,IPTC字段#80)开始.
(XX XX = 2个字节的长度字,描述了所提到的段数据的大小).
JPEG文件和元数据中是否还有其他尺寸标记可供查找?在使用自定义IPTC字段附加元数据片段时是否必须增加其大小?
如何添加可用于已包含IPTC段的所有JPEG图像的自定义元数据字段(例如#225)?
在C#中工作,但这是关于字节操作的问题所以我猜语言并不重要.
我希望能够在JPEG的元数据中添加文本注释,并能够从iphone应用程序中读取它.
我认为这很简单,因为ios4包含对EXIF信息的支持.所以我使用一个名为used AnalogExif的Windows工具添加元数据,并使用以下方法从我的应用程序中读回:
NSData *jpeg = UIImageJPEGRepresentation(myUIImage,1.0);
CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)jpeg, NULL);
NSDictionary *metadata = (NSDictionary *) CGImageSourceCopyPropertiesAtIndex(source,0,NULL);
NSMutableDictionary *metadataAsMutable = [[metadata mutableCopy]autorelease];
[metadata release];
NSMutableDictionary *EXIFDictionary = [[[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyExifDictionary]
Run Code Online (Sandbox Code Playgroud)
这有用......到了一点:)
我在元数据字典中得到的是:
(gdb) po metadata
{
ColorModel = RGB;
Depth = 8;
Orientation = 1;
PixelHeight = 390;
PixelWidth = 380;
"{Exif}" = {
ColorSpace = 1;
PixelXDimension = 380;
PixelYDimension = 390;
};
"{JFIF}" = {
DensityUnit = 0;
JFIFVersion = (
1,
1
);
XDensity = 1; …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个图像处理器脚本来基本调整图像大小.问题是,当我制作调整大小的图像副本时,它也不会复制IPTC数据.所以我一直在检查IPTC PHP函数(iptcparse和iptcembed),但我很困惑.使用iptcparse非常简单.它将所有数据转换为数组,然后使用print_r将其打印出来.但是所谓的有用的是iptcembed,因为它允许你(如名字所示)在你的图像上嵌入IPTC.从php.net看这个例子我不太明白.我是否必须手动创建我的阵列才能将其嵌入到新图像中.我想有一种简单的方法可以复制一张图像IPTC的数据并将其嵌入到其他图像中.
任何答案都将受到欢迎.提前致谢.
我正在尝试使用 php 从 jpg 图像(http://pepeliana.com/images/DSC4008.jpg)中获取一些 iptc 元数据。引用图像的标题元数据设置为“测试”。我已经阅读了 php 手册和似乎可以完成工作的两个函数 - iptcparse() 和 exif_read_data()。这两个功能都在php中启用。但是,对于我的一生,我无法弄清楚为什么这两个函数都没有返回所需的数据。这是我尝试过的示例代码,我还应该提一下,我还在几张具有 Title iptc 元数据的图像上尝试了此代码(因此排除了图像损坏或元数据设置不当的可能性):
<?php
$size = getimagesize ('DSC4008.jpg', $info);
if(is_array($info)) {
$iptc = iptcparse($info["APP13"]);
foreach (array_keys($iptc) as $s) {
$c = count ($iptc[$s]);
for ($i=0; $i <$c; $i++)
{
echo $s.' = '.$iptc[$s][$i].'<br>';
}
}
}
?>
Run Code Online (Sandbox Code Playgroud)
还:
<?php
$exif = exif_read_data('DSC4008.jpg', 0, true);
echo $exif['WINXP']['Title'];
?>
Run Code Online (Sandbox Code Playgroud)
如您所见,这很简单,但是,我无法返回我想要的东西。显然我一定遗漏了一些明显简单的东西,不是吗?请帮忙!
我已经尝试过IPTCInfo3。但是安装成功后
pip3 install IPTCInfo
Run Code Online (Sandbox Code Playgroud)
我收到导入错误:
Python 3.5.2 (default, Oct 11 2016, 04:59:56)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin
from iptcinfo import IPTCInfo
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Applications/PyCharm.app/Contents/helpers/pydev/_pydev_bundle/pydev_import_hook.py", line 21, in do_import
module = self._system_import(name, *args, **kwargs)
ImportError: No module named 'iptcinfo'
Run Code Online (Sandbox Code Playgroud) 我有一个 Node.js 服务器,它的工作是下载 JPEG 图像,将某些数据写入几个 IPTC 字段(例如Iptc.Application2.Caption
)并将图像传递给另一个服务。
理想情况下,我想将 IPTC 数据写入内存缓冲区(而不将图像写入本地文件系统)。如果做不到这一点,我可以采用一种解决方案,在该解决方案中我下载、将文件存储到 FS,然后应用 IPTC 数据。
我已经使用https://github.com/dberesford/exiv2node 进行了这项工作,但它不适用于 Node.js v10。而且它依赖于exiv2 C++ 库,这使得运行容器化变得很麻烦。
所以我的问题是:是否有一个像样的 Node.js 模块可以实现 IPTC 数据写入,并且不依赖于某些怪物 C 库?
我正在构建一个 WPF 桌面应用程序来帮助我组织照片以发布到 Facebook。以下是我在新位置创建照片副本并添加标题(EXIF + IPTC + XMP)的代码:
private void SaveImageAs(string currPath, string newPath, bool setCaption = false, string captionToSet = "")
{
System.IO.FileStream stream = new System.IO.FileStream(currPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
JpegBitmapDecoder decoder = new JpegBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.None);
BitmapFrame bitmapFrame = decoder.Frames[0];
BitmapMetadata metadata = bitmapFrame.Metadata.Clone() as BitmapMetadata;
stream.Close();
if (setCaption)
{
// if we want to set the caption, do it in EXIF, IPTC, and XMP
metadata.SetQuery("/app1/ifd/{uint=270}", captionToSet);
metadata.SetQuery("/app13/irb/8bimiptc/iptc/Caption", captionToSet);
metadata.SetQuery("/xmp/dc:description/x-default", captionToSet);
}
MemoryStream memstream = new MemoryStream(); // …
Run Code Online (Sandbox Code Playgroud) 我无法找到有关如何从Cocoa中的图像读取EXIF/IPTC信息的最新示例.有什么可以轻松完成的,或者我应该使用外部工具作为exiftool并使用NSTask启动它?
谢谢 !