昨晚睡觉前,我再次浏览了Learning Perl的Scalar Data部分,并发现了以下句子:
在字符串中包含任何字符的能力意味着您可以创建,扫描和操作原始二进制数据作为字符串。
一个想法立刻让我觉得我实际上可以让Perl扫描我存储在硬盘上的图片来检查它们是否包含Adobe字符串。通过这样做,我可以分辨出哪些已被拍照。所以我尝试实现这个想法并提出以下代码:
#!perl
use autodie;
use strict;
use warnings;
{
local $/="\n\n";
my $dir = 'f:/TestPix/';
my @pix = glob "$dir/*";
foreach my $file (@pix) {
open my $pic,'<', "$file";
while(<$pic>) {
if (/Adobe/) {
print "$file\n";
}
}
}
}
令人兴奋的是,代码似乎真的很有效,它可以过滤出已经过photoshopped的图片。但问题是许多图片是由其他公用事业编辑的。我想我有点卡在那里。我们是否有一些简单但通用的方法来判断数字图片是否已被编辑,如
if (!= /the origianl format/) {...}
或者我们只是需要添加更多条件?像
if (/Adobe/|/ACDSee/|/some other picture editors/)
有关于此的任何想法吗?或者由于我的编程知识非常有限,我还是过于简单化了?
一如既往地感谢任何指导。
答案 0 :(得分:8)
你在Perl中最好的选择可能是ExifTool。这使您可以访问嵌入到图像中的任何非图像信息。但是,正如其他人所说,当然可以删除这些信息。
答案 1 :(得分:4)
我不是说绝对没有办法检测图像的变化,但问题非常困难。
我认识的唯一一位声称拥有答案的人是Dr. Neal Krawetz,他声称图像的数字化部分与原始部分的压缩错误率不同。他声称以不同质量水平重新保存JPEG将突出显示这些差异。
在我的调查中,我没有发现这种情况,但也许你可能会有更好的结果。
答案 2 :(得分:3)
没有。完美编辑的图像和从头开始的图像之间没有功能区别 - 毕竟,最终只是一包像素,以及您可以删除或伪造所需的任何其他元数据。
答案 3 :(得分:3)
用于编辑图像的图形程序的名称不是图像数据本身的一部分,而是称为元数据的一部分 - 可能存储在图像文件中,但正如其他人所指出的那样,既不需要(因此某些程序可能不会存储它,有些可能允许您选择不存储它)也不可靠 - 如果您伪造图像,您可能也伪造了元数据。
所以你的问题的答案是“不,没有办法普遍告诉图片是否被编辑过,虽然有些图像编辑软件可能会将其签名写入图像文件中,但它会被粗略地留在那里编辑人员。
答案 4 :(得分:3)
如果您倾向于了解有关Perl中图像处理的更多信息,您可以查看CPAN提供的一些优秀模块:
但是,还有其他实用程序可用于识别各种图像格式。这对Super User来说更像一个问题,但是对于各种unix发行版,你可以使用file
来识别许多不同类型的文件,对于MacOSX,Graphic Converter从未让我失望。 (它甚至可以打开我从兽医的光盘上拍到的猫的破碎骨盆的奇怪的多档X光片。)
答案 5 :(得分:1)
你怎么知道原始格式是什么?我很确定无法保证图像是否已被修改。
我可以打开文件(使用我最喜欢的编程语言和文件系统API),然后在willy-nilly中将任何我想要的内容写入该文件。只要我不用文件格式搞砸了,你就不会知道它发生了。
哎呀,我可以将图像打印出来,然后将其扫描回来;你怎么会从原版中说出来?
答案 6 :(得分:1)
正如其他人所说,没有办法知道图像是否被篡改。我猜你真正想知道的是真实照片与已经增强或修改过的照片之间的区别。
总是可以选择运行一些非常复杂的图像识别算法来分析图像中的每个像素,并做一些非常复杂的事情来确定图像是否被修改。这个解决方案可能涉及AI,它可以检查数百万张被篡改过的照片和那些没有被篡改的照片并从中学习。然而,这更像是一个理论上的解决方案而且不太实用......你可能只会在电影中看到它。这将是非常复杂的发展,可能需要数年。即使你确实得到了类似的东西,它仍然可能不会100%正确。我猜测AI技术仍然没有达到这个水平,可能需要一段时间才能实现。
答案 7 :(得分:1)
exiftool的一个不为人知的特性允许您通过分析JPEG量化表(不依赖于图像元数据)来识别原始软件。它识别许多应用程序编写的表。请注意,某些相机可能会使用与某些应用程序相同的量化表,因此这不是100%的解决方案,但值得研究。以下是exiftool在两个图像上运行的示例,第一个是由photoshop编辑的。
> exiftool -jpegdigest a.jpg b.jpg
======== a.jpg
JPEG Digest : Adobe Photoshop, Quality 10
======== b.jpg
JPEG Digest : Canon EOS 30D/40D/50D/300D, Normal
2 image files read
即使已删除元数据,这也会有效。
答案 8 :(得分:0)
现有的软件使用各种技术(压缩伪像,与摄像机数据库中的签名配置文件进行比较等)来分析实际图像数据以获得改变的证据。如果您可以访问此类软件并且您可以使用的软件提供了用于外部访问这些分析功能的API,则存在与该API接口的Perl模块的可能性很大,如果不存在此类模块,则可能可能会很快创建。
从理论上讲,也可以直接在原生Perl中实现图像分析代码,但我不知道有没有人这样做过,我希望你最好写一些低级的东西。处理器密集型采用完全编译的语言(例如,C / C ++),而不是Perl。
答案 9 :(得分:0)
http://www.impulseadventure.com/photo/jpeg-snoop.html 是一个完成工作的工具
如果有任何克隆,像素密度或浓度会有变化,有时会出现...手动检查 Photoshop克隆区域将具有均匀的像素密度(我的意思是像素与扫描图像的变化)