如何在PHP中逐像素重绘图像?

如何在PHP中逐像素重绘图像?,php,image-processing,Php,Image Processing,和标题差不多。转换会添加工件,而我需要一个精确的副本,但只需要图像本身,完全去除原始文件中可能存在或可能不存在的所有其他内容。所以,我想我需要以某种方式预先渲染,然后一次一个像素地重新创建图像,但我甚至不知道如何进行。谷歌搜索给我带来的只是转换和刷新,因此任何帮助都将不胜感激。从图像中删除所有EXIF、GPS、IPTC、作者、版权和颜色配置文件的一种方法是使用ImageMagick,它在所有Linux发行版、macOS和Windows上都可用 在命令行中,您可以执行以下操作: convert i

和标题差不多。转换会添加工件,而我需要一个精确的副本,但只需要图像本身,完全去除原始文件中可能存在或可能不存在的所有其他内容。所以,我想我需要以某种方式预先渲染,然后一次一个像素地重新创建图像,但我甚至不知道如何进行。谷歌搜索给我带来的只是转换和刷新,因此任何帮助都将不胜感激。

从图像中删除所有EXIF、GPS、IPTC、作者、版权和颜色配置文件的一种方法是使用ImageMagick,它在所有Linux发行版、macOS和Windows上都可用

在命令行中,您可以执行以下操作:

convert input.jpg -strip output.jpg
如果要使用PHP实现这一点,可以使用Imagick等效工具:

bool Imagick::stripImage ( void )
这是有案可查的。所以这看起来像:

// Load input image and strip everything
$image = new Imagick('start.jpg');
$image->stripImage();

// Output result
$image->writeImage('result.jpg');
另一种可能更简单、更轻的方法是使用
exiftool
(它“只是一个简单的”Perl脚本,而不是像ImageMagick这样的大型软件包)如下:

exiftool -all= YourImage.jpg
convert YourImage.jpg -strip pam:- | convert pam:- result.jpg
如果您觉得更容易,还可以使用
system()
从PHP“shell out”来运行这些命令


如果您对此非常怀疑,您可以将其转换为根本不支持元数据的中间格式,例如
NetPBM
格式(然后再转换为JPEG,如下所示:

exiftool -all= YourImage.jpg
convert YourImage.jpg -strip pam:- | convert pam:- result.jpg
如果你想知道为什么我仍然使用上面的
-strip
,那是因为NetPBM确实支持注释,所以我想去掉它们。如果你想知道为什么我选择PAM格式而不是PPM格式,那么它适用于可能有4个通道(即RGB和透明度)的PNG文件


您可以使用以下方法检查图像中仍包含哪些信息:

jhead -v YourImage.jpg
或:

或者,您可以在图像中找到所有类似字符串的文本,并使用
grep
查看是否有您特别不想要的内容漏掉:

strings YourImage.jpg | grep -Ei "copyright|latitude|longitude|author"

转换不会添加人工制品,而是以非无损格式保存(通常)。您到底想做什么?(png、bmp和tiff通常可用/无损)请发布之前和之后的图像示例,以及您用于转换图像的命令。您没有提供足够的信息来帮助我们。@Blackhole,我正在尝试确保上载的图像文件只包含图片本身。没有EXIF,没有其他元数据,没有连接的有效载荷,什么都没有。即使使用他使用了最初使用的同一个编码器,这将改变信息内容;参见Blackhole@symcbean这是不正确的。命令
exiftool-all=start.jpg
不会对图像进行重新编码。请尝试。获取包含一些元数据的图像,并计算所有像素的哈希值(不包括元数据)使用
convert start.jpg-format%#info:
现在用
exiftool
像这样剥离图像
exiftool-all=start.jpg
并重新检查散列,你会看到像素没有改变。@Mark Setchell我需要的不仅仅是剥离传统的元数据,还有可能已经连接的任何内容,比如在fam中使用JPEG将存档压缩到图像的技巧:如果以jpg格式打开它,它将正确显示图像;如果以存档格式打开它,它将正确打开存档。