Ответ 1
Я думаю, что чтение в файл в объект Bitmap и запись в файл снова должны сделать трюк.
Помню, что я разочаровался, выполняя свою "программу поворота изображения", которая удалила данные EXIF. Но в этом случае это именно то, что вы хотите!
Как я могу удалить все EXIF-данные из JPEG, я нашел множество примеров, как читать и редактировать данные EXIF с различными библиотеками, но все, что мне понадобится, - простой пример, как удалить его.
он просто для тестирования предлагает, чтобы даже самый уродливый и взломанный подход был бы полезен:)
Я уже пробовал поиск маркеров начала/конца EXIF 0xFFE1 и 0xFFE2, последний не существует в моем случае 0_o
TIA
Я думаю, что чтение в файл в объект Bitmap и запись в файл снова должны сделать трюк.
Помню, что я разочаровался, выполняя свою "программу поворота изображения", которая удалила данные EXIF. Но в этом случае это именно то, что вы хотите!
Впервые я написал об этом, используя библиотеки WPF в своем блоге, но этот сорт не удался, поскольку вызовы backend Windows немного перепутаны.
My окончательное решение также намного быстрее, в основном байт патчи jpeg, чтобы удалить exif. Быстро и просто:)
[EDIT: сообщение в блоге имеет более обновленный код]
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.WriteByte(0xff);
outStream.WriteByte(0xd8);
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();
}
}
}
}
}
что вам следует избегать - это декодировать и перекодировать изображения, потому что это повредит качеству. вместо этого вы должны найти способ изменить только метаданные. я не пробовал, но думаю, InPlaceBitmapMetadataWriter будет делать трюк.
Это слишком просто, используйте jhead.exe отсюда: http://www.sentex.net/~mwandel/jhead/
Сделайте небольшой пакетный файл, если хотите, например:
jhead.exe -purejpg *.jpg
Он удалит все метаданные из всех jpeg в той же папке.
Если это только один файл, вы пробовали прочитать в пакет краски, такой как Paint.NET или Paint Shop Pro, и сохранить его как новый файл?
Возможно, вам придется сначала скопировать изображение в новый файл.
Конечно, если есть много файлов, то это может быть не лучший подход;). Хотя сказал, что Paint Shop Pro имеет пакетный вариант конвертации, который может стоить исследовать.
РЕДАКТИРОВАТЬ: Возможно, стоит исследовать пакетные операции в пакетах красок (вместо пакетов обработки фотографий, поскольку они с большей вероятностью сохраняют данные EXIF) и посмотреть, можно ли их автоматизировать. Затем вы можете записать файл script/пакетный файл для обработки ваших изображений.
В этом случае будет применен комментарий iik о чтении и записи файла, ухудшающего изображение, но может быть сведен к минимуму путем записи с минимальным сжатием.