如何从JPEG图像中删除所有EXIF数据?
我找到了很多关于如何使用各种库来读取和编辑EXIF数据的示例,但我需要的只是一个关于如何删除它的简单示例。
它只是用于测试建议,所以即使是最丑陋和最黑客的方法也会有所帮助:)
我已经尝试过搜索EXIF开始/结束标记0xFFE1& 0xFFE2。在我的案例中,最后一个不存在。
答案 0 :(得分:24)
我首先在我的博客中使用WPF库写了这个,但是由于Windows后端调用有点混乱,这种情况有所失败。
我的final solution也快得多,基本上字节修补jpeg以删除exif。快速而简单:)
[编辑:博客帖子有更新的代码]
namespace ExifRemover
{
public class JpegPatcher
{
public Stream PatchAwayExif(Stream inStream, Stream outStream)
{
byte[] jpegHeader = new byte[2];
jpegHeader[0] = (byte) inStream.ReadByte();
jpegHeader[1] = (byte) inStream.ReadByte();
if (jpegHeader[0] == 0xff && jpegHeader[1] == 0xd8)
{
SkipExifSection(inStream);
}
outStream.Write(jpegHeader,0,2);
int readCount;
byte[] readBuffer = new byte[4096];
while ((readCount = inStream.Read(readBuffer, 0, readBuffer.Length)) > 0)
outStream.Write(readBuffer, 0, readCount);
return outStream;
}
private void SkipExifSection(Stream inStream)
{
byte[] header = new byte[2];
header[0] = (byte) inStream.ReadByte();
header[1] = (byte) inStream.ReadByte();
if (header[0] == 0xff && header[1] == 0xe1)
{
int exifLength = inStream.ReadByte();
exifLength = exifLength << 8;
exifLength |= inStream.ReadByte();
for (int i = 0; i < exifLength - 2; i++)
{
inStream.ReadByte();
}
}
}
}
}
答案 1 :(得分:6)
我认为将文件读入Bitmap对象并再次写入文件应该可以解决问题。
我记得在执行“图像旋转程序”时感到沮丧,因为它删除了EXIF数据。但在这种情况下,它正是你想要的!
答案 2 :(得分:1)
这太简单了,请从这里使用jhead.exe:http://www.sentex.net/~mwandel/jhead/
如果需要,请制作一个小批量文件:
jhead.exe -purejpg *.jpg
它将从同一文件夹中的所有jpeg中删除所有元数据。
答案 3 :(得分:0)
如果只有一个文件,您尝试读取Paint.NET或Paint Shop Pro等绘图包并将其重新保存为新文件?
您可能需要先将图像复制到新文件中。
当然,如果有很多文件,那么这可能不是最好的方法;)。虽然说过Paint Shop Pro有一个批量转换选项,可能值得研究。
编辑:仍然可能值得调查绘图包中的批处理操作(而不是照片处理包,因为这些更可能保留EXIF数据)并查看它们是否可以自动化。然后,您可以编写脚本/批处理文件来处理图像。
iik关于读取和写入降级图像的文件的注释将适用于这种情况,但可以通过以最小压缩编写来最小化。
答案 4 :(得分:0)
您应该避免的是对图像进行解码和重新编码,因为这会影响质量。相反,你应该找到一种方法来只修改元数据。我没试过,但我认为InPlaceBitmapMetadataWriter会做到这一点。