昨晚睡觉前,我又浏览了《学习Perl》的标量数据部分,看到了下面这句话:

字符串中包含任何字符的能力意味着您可以将原始二进制数据作为字符串创建、扫描和操作。

我立即想到了一个想法,我实际上可以让 Perl 扫描我存储在硬盘上的图片,以检查它们是否包含字符串 Adob​​e。似乎通过这样做,我可以看出其中哪些是经过修图的。所以我尝试实现这个想法并提出了以下代码:

#!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";
            }
        }
    }
}

令人兴奋的是,该代码似乎确实有效,它可以过滤掉经过 Photoshop 处理的图片。但问题是许多图片是由其他实用程序编辑的。我想我有点被困在那里了。我们是否有一些简单但通用的方法来判断数码图片是否已被编辑,例如

if (!= /the origianl format/) {...}

或者我们只需添加更多条件?喜欢

if (/Adobe/|/ACDSee/|/some other picture editors/)

对此有什么想法吗?或者由于我的编程知识极其有限,我是否过于简单化了?

一如既往,感谢您的指导。

有帮助吗?

解决方案

您在Perl中的最佳选择可能是 ExifTool 。这使您可以访问嵌入到图像中的任何非图像信息。但是,正如其他人所说,当然可以删除这些信息。

其他提示

我不是说绝对没有办法检测图像的变化,但问题非常困难。

我认识的唯一一位声称有答案的人是博士Neal Krawetz 声称图像的数字化部分与原始部分的压缩错误率不同。他声称以不同质量水平重新保存JPEG将突出显示这些差异。

在我的调查中,我没有发现这种情况,但也许你可能会有更好的结果。

没有。完美编辑的图像和从头开始的图像之间没有功能区别 - 毕竟,最终只是一包像素,以及您可以删除或伪造所需的任何其他元数据。

用于编辑图像的图形程序的名称不是图像数据本身的一部分,而是称为元数据的一部分 - 可能存储在图像文件中,但正如其他人所指出的那样,既不需要(因此某些程序可能不会存储它,有些可能允许您选择不存储它)也不可靠 - 如果您伪造图像,您可能也伪造了元数据。

所以你的问题的答案是“不,没有办法普遍告诉图片是否被编辑过,虽然有些图像编辑软件可能会将其签名写入图像文件中,但它会被粗心大意留在那里编辑人员。

如果您想了解有关 Perl 图像处理的更多信息,您可以看看 CPAN 提供的一些优秀模块:

  • 图片::魔法 - 读取、操作和写入大量图像文件格式
  • GD - 使用大量图形基元创建彩色绘图,并以各种格式发出绘图。
  • GD::图 - 创建图表
  • GD::Graph3d - 使用 GD 和 GD::Graph 创建 3D 图形

然而,还有其他实用程序可用于识别各种图像格式。这更多的是一个问题 超级用户, ,但是对于各种 UNIX 发行版,您可以使用 file 识别许多不同类型的文件,对于 MacOSX, 图形转换器 从来没有让我失望过。(它甚至能够打开我从兽医那里得到的光盘上我的猫破碎的骨盆的奇怪的多文件 X 射线。)

你怎么知道原始格式是什么?我很确定无法保证图像是否已被修改。

我可以打开文件(使用我最喜欢的编程语言和文件系统API),然后在willy-nilly中将任何我想要的内容写入该文件。只要我不用文件格式搞砸了,你就不会知道它发生了。

哎呀,我可以将图像打印出来,然后将其扫描回来;你怎么会从原版中说出来?

正如其他人所说,没有办法知道图像是否被篡改。我猜你真正想知道的是真实照片与已经增强或修改过的照片之间的区别。

总是可以选择运行一些非常复杂的图像识别算法来分析图像中的每个像素,并做一些非常复杂的事情来确定图像是否被修改。这个解决方案可能涉及AI,它可以检查数百万张被篡改过的照片和那些没有被篡改的照片并从中学习。然而,这更像是一个理论上的解决方案而且不太实用......你可能只会在电影中看到它。这将是非常复杂的发展,可能需要数年。即使你确实得到了类似的东西,它仍然可能不会100%正确。我猜测AI技术仍然没有达到这个水平,可能需要一段时间才能实现。

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

即使已删除元数据,这也会有效。

现有的软件使用各种技术(压缩伪像,与摄像机数据库中的签名配置文件进行比较等)来分析实际图像数据以获得改变的证据。如果您可以访问此类软件并且您可以使用的软件提供了用于外部访问这些分析功能的API,则存在与该API接口的Perl模块的可能性很大,如果不存在此类模块,则可能可能会很快创建。

从理论上讲,也可以直接在原生Perl中实现图像分析代码,但我不知道有没有人这样做过,我希望你最好写一些低级的东西。处理器密集型采用完全编译的语言(例如,C / C ++),而不是Perl。

http://www.impulseadventure.com/photo/jpeg-snoop.html 是一个完成工作的工具

如果有任何克隆,像素密度或浓度会有变化,有时会出现...手动检查 Photoshop克隆区域将具有均匀的像素密度(我的意思是像素与扫描图像的变化)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top