我想知道以下情况是否有任何解决方案:
我有一个应用程序,它在扫描和转码后将文件上传到服务器上。假设,正在上传一个图像文件,该文件已被篡改了一些附加内容。现在,由于上传的文件是非法的,我想删除额外的篡改内容,只上传这个图像文件的原始部分。在Java中可以这样做吗?
谢谢。
在一般情况下无法检测到,但有一些启发式方法可用于确定图像是否已被编辑。尝试使用http://imageedited.com/上的工具来了解可能的情况。
删除编辑是一个更加困难的问题,这对于当前的方法来说可能是不可能的。
我只是在这里推测,我不知道它在实践中的效果如何,但如果你限制特定的篡改来源,你可以做到这一点。例如,假设您想删除 memegenerator.net 添加到图像的徽标。
您提前知道文本的外观和位置。创建一个与文本匹配的透明 png 模板。然后将图像和模板像素颜色之间的差异相加,将每个颜色乘以模板像素的 alpha。因为对于这个特定的标志,它基本上是白色的(虽然它似乎有一个薄薄的黑色阴影),所以你会得到一个有白色部分的图片的误报,所以你还需要验证周围的像素是(在一个宽容)不是白色的。这并不聪明,但它可以适用于某些网站。
对于任何更灵活的东西(例如,随后调整大小的图像上的徽标),您将进入 OCR 和类似 TinEye 的图像匹配领域,这比我建议的更先进。
为了正确检测各种“篡改”并从“合法”中过滤掉“非法”,您需要一个能够理解所见内容的含义和上下文的人工智能。简短的回答是:你不能。这就是人类的目的。
如果这是针对网站的,您可以做的最好的事情可能是一个报告按钮,让您网站的用户报告不符合您网站规则的图像。