JPEG를 다시 압축하지 않고 EXIF 데이터를 제거하는 방법은 무엇입니까?
JPEG 파일에서 EXIF 정보 (썸네일, 메타 데이터, 카메라 정보 등 모든 것을 포함)를 제거하고 싶지만 JPEG를 다시 압축하면 품질이 향상되고 일반적으로 이미지 품질이 향상됩니다. 파일 크기.
단일 라인을 사용하면 유닉스 / 리눅스 솔루션을 찾고 있습니다. ImageMagick (변환 도구)을 사용하십시오. 이것이 가능하지 않다면 작은 Python, Perl, PHP (또는 Linux의 다른 공용 언어) 펼쳐집니다.
비슷한 질문이 있지만 .NET 관련이과 있습니다.
exiftool이 나를 위해 일을 해, 그것은 펄로 작성되고 어떤 당신을 위해 일해야합니다
http://www.sno.phy.queensu.ca/~phil/exiftool
사용법 :
exiftool -all= image.jpg
imagemagick 사용 :
convert <input file> -strip <output file>
ImageMagick에는 -strip 매개 변수가 저장하기 전에 이미지를 다시 압축합니다. 따라서 그 매개 변수는 내 필요에 쓸모가 없습니다.
ImageMagick 포럼 의이 주제는 ImageMagick 에서 JPEG 무손실 작업이 지원되지 않으며 설명하고 (이 변경 될 때마다 링크로 주석을 게시하십시오!) jpegtran (libjpeg) 사용을 제안합니다 .
jpegtran -copy none image.jpg > newimage.jpg
jpegtran -copy none -outfile newimage.jpg image.jpg
(내 자신의 질문에 대답에 대해 당신이 모르는 경우 , 읽기 이 와 이 와 이 )
Exiv2 를 볼 수 있습니다. 정말 빠르며 (C ++ 및 재 압축 안 됨) 명령 줄이며 , 강력한 수있는 EXIF 조작을위한 라이브러리도 제공합니다. Linux 배포판을 몇 개나 사용할 수 있는지 모르지만 CentOS에서는 현재 기본 저장소에서 사용할 수 있습니다.
용법 :
exiv2 rm image.jpg
나는 제안 할 것이다 jhead:
man jhead
jhead -purejpg image.jpg
데비안 / 우분투에서는 123Kb 만 재 압축되지 않습니다. 필요한 경우 원본을 복사하십시오.
최근에 C 에서이 프로젝트를 수행했습니다. 아래 코드는 다음을 수행합니다.
1) 이미지의 현재 방향을 가져옵니다.
2) APP1(Exif 데이터) 및 APP2(Flashpix 데이터)에 포함 된 모든 데이터 를 공백으로 제거합니다.
3) APP1방향 마커를 다시 만들어 원래 값으로 설정합니다.
4) 첫 번째 EOI마커 (이미지 끝)를 찾고 필요한 경우 파일을 자 사용합니다.
다음과 먼저 시작해야합니다.
1)이 프로그램은 Nikon 카메라에 사용됩니다. Nikon의 JPEG 형식은 생성 된 각 파일의 끝 부분에 설명을 추가합니다. 그들은 두 번째 EOI마커 를 생성하여 데이터를 이미지 파일의 끝에 인코딩합니다 . 일반적으로 이미지 프로그램은 EOI발견 된 첫 번째 마커 까지 읽습니다 . Nikon 은이 나중에 내 프로그램이 잘리는 정보를 가지고 있습니다.
2) Nikon 형식을 따라 big endian순서를 가정합니다 . 파일 이미지 little endian이을 사용하는 경우 약간의 조정이 필요합니다.
3) ImageMagickexif 데이터를 사용하는 데 사용 하려고 할 때 , 내가 쓰는 것보다 큰 파일로 끝나는 것을 알았습니다. 이것은 내가 Imagemagick원하는 데이터를 인코딩하고 파일의 다른 곳에 저장하고 믿게 합니다. 구식이라고 부르지 만 파일에서 설명을 제거 할 때 파일 크기가 같지 더 작기를 원합니다. 다른 결과는 데이터 마이닝을 제안합니다.
그리고 여기 코드가 있습니다.
#include <stdio.h>
#include <stdlib.h>
#include <libgen.h>
#include <string.h>
#include <errno.h>
// Declare constants.
#define COMMAND_SIZE 500
#define RETURN_SUCCESS 1
#define RETURN_FAILURE 0
#define WORD_SIZE 15
int check_file_jpg (void);
int check_file_path (char *file);
int get_marker (void);
char * ltoa (long num);
void process_image (char *file);
// Declare global variables.
FILE *fp;
int orientation;
char *program_name;
int main (int argc, char *argv[])
{
// Set program name for error reporting.
program_name = basename(argv[0]);
// Check for at least one argument.
if(argc < 2)
{
fprintf(stderr, "usage: %s IMAGE_FILE...\n", program_name);
exit(EXIT_FAILURE);
}
// Process all arguments.
for(int x = 1; x < argc; x++)
process_image(argv[x]);
exit(EXIT_SUCCESS);
}
void process_image (char *file)
{
char command[COMMAND_SIZE + 1];
// Check that file exists.
if(check_file_path(file) == RETURN_FAILURE)
return;
// Check that file is an actual JPEG file.
if(check_file_jpg() == RETURN_FAILURE)
{
fclose(fp);
return;
}
// Jump to orientation marker and store value.
fseek(fp, 55, SEEK_SET);
orientation = fgetc(fp);
// Recreate the APP1 marker with just the orientation tag listed.
fseek(fp, 21, SEEK_SET);
fputc(1, fp);
fputc(1, fp);
fputc(18, fp);
fputc(0, fp);
fputc(3, fp);
fputc(0, fp);
fputc(0, fp);
fputc(0, fp);
fputc(1, fp);
fputc(0, fp);
fputc(orientation, fp);
// Blank the rest of the APP1 marker with '\0'.
for(int x = 0; x < 65506; x++)
fputc(0, fp);
// Blank the second APP1 marker with '\0'.
fseek(fp, 4, SEEK_CUR);
for(int x = 0; x < 2044; x++)
fputc(0, fp);
// Blank the APP2 marker with '\0'.
fseek(fp, 4, SEEK_CUR);
for(int x = 0; x < 4092; x++)
fputc(0, fp);
// Jump the the SOS marker.
fseek(fp, 72255, SEEK_SET);
while(1)
{
// Truncate the file once the first EOI marker is found.
if(fgetc(fp) == 255 && fgetc(fp) == 217)
{
strcpy(command, "truncate -s ");
strcat(command, ltoa(ftell(fp)));
strcat(command, " ");
strcat(command, file);
fclose(fp);
system(command);
break;
}
}
}
int get_marker (void)
{
int c;
// Check to make sure marker starts with 0xFF.
if((c = fgetc(fp)) != 0xFF)
{
fprintf(stderr, "%s: get_marker: invalid marker start (should be FF, is %2X)\n", program_name, c);
return(RETURN_FAILURE);
}
// Return the next character.
return(fgetc(fp));
}
int check_file_jpg (void)
{
// Check if marker is 0xD8.
if(get_marker() != 0xD8)
{
fprintf(stderr, "%s: check_file_jpg: not a valid jpeg image\n", program_name);
return(RETURN_FAILURE);
}
return(RETURN_SUCCESS);
}
int check_file_path (char *file)
{
// Open file.
if((fp = fopen(file, "rb+")) == NULL)
{
fprintf(stderr, "%s: check_file_path: fopen failed (%s) (%s)\n", program_name, strerror(errno), file);
return(RETURN_FAILURE);
}
return(RETURN_SUCCESS);
}
char * ltoa (long num)
{
// Declare variables.
int ret;
int x = 1;
int y = 0;
static char temp[WORD_SIZE + 1];
static char word[WORD_SIZE + 1];
// Stop buffer overflow.
temp[0] = '\0';
// Keep processing until value is zero.
while(num > 0)
{
ret = num % 10;
temp[x++] = 48 + ret;
num /= 10;
}
// Reverse the word.
while(y < x)
{
word[y] = temp[x - y - 1];
y++;
}
return word;
}
이것이 누군가를 돕기를 바랍니다!
편의를위한 힌트 : Windows를 사용하는 경우 힌트 에 REG 파일을 적용하고 상황에 맞는 메뉴 항목을 설치하면 파일을 마우스 오른쪽 단추로 클릭하고 명령을 선택하여 메타 데이터를 쉽게 제거 할 수 있습니다.
예를 들어, 컴퓨터에서 실행 파일이 위치를 가리 키도록 경로를 편집해야합니다.
JPEG, JPG, JPE, JFIF 파일의 경우 : " 메타 데이터 제거 " 명령
( ExifTool 사용 , 원본 파일을 백업으로 유지)
exiftool -all= image.jpg
JPG-RemoveExif.reg
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\jpegfile\shell\RemoveMetadata]
@="Remove metadata"
[HKEY_CURRENT_USER\Software\Classes\jpegfile\shell\RemoveMetadata\command]
@="\"C:\\Path to\\exiftool.exe\" -all= \"%1\""
[HKEY_CURRENT_USER\Software\Classes\jpegfile\shell\RemoveMetadata]
"Icon"="C:\\Path to\\exiftool.exe,0"
PNG 파일의 경우 : 명령 " 축소 된 PNG로 변환을 "
(사용 ImageMagick이를 원본 파일을 덮어 쓰기, 데이터를 변경)
convert -background none -strip -set filename:n "%t" image.png "%[filename:n].png"
PNG-Minify.reg
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\pngfile\shell\ConvertToMinifiedPNG]
@="Convert to minified PNG"
[HKEY_CURRENT_USER\Software\Classes\pngfile\shell\ConvertToMinifiedPNG\command]
@="\"C:\\Path to\\convert.exe\" -background none -strip -set filename:n \"%%t\" \"%1\" \"%%[filename:n].png\""
[HKEY_CURRENT_USER\Software\Classes\pngfile\shell\ConvertToMinifiedPNG]
"Icon"="C:\\Path to\\convert.exe,0"
관련 : 컨텍스트 메뉴에서 PNG를 ICO로 변환합니다 .
대한 손실 EXIF 당신이 사용할 수있는 제거 libexif 이며, Cygwin에서 사용할 수를 . 이미지를 익명화하려면 EXIF와 축소판을 모두 제거하십시오.
$ exif --remove --tag=0 --remove-thumbnail exif.jpg -o anonymized.jpg
.batcygwin에서 사용할 드래그 앤 드롭 파일 :
@ECHO OFF
exif --remove --tag=0 --remove-thumbnail %~1
기타 소프트웨어 :
"MetabilityQuickFix는 단 한 번의 마우스 클릭으로 모든 사진에서 모든 개인 정보와 GPS 위치 데이터를 제거합니다. JPEG 파일에서 Exif, Iptc 및 XMP 데이터 블록의 모든 메타 데이터 항목을 안전하게 제거하고 원본 파일의 백업 복사본을 자동으로 만듭니다. "
"JPG / JPEG / JFIF 및 PNG 파일에서 불필요한 메타 데이터 (정크)를 제거 / 정리 / 제거하는 도구입니다. 이미지 품질은 영향을받지 않습니다. 명령 줄 지원이 포함됩니다. 명령 줄에서 폴더 또는 파일을 지정하기 만하면됩니다 (와일드 카드 허용)."
이를 사용하여 TIFF 파일에서 위도 데이터를 제거했습니다.
exiv2 mo -M"del Exif.GPSInfo.GPSLatitude" IMG.TIFexiv2 -pa IMG.TIF모든 메타 데이터를 나열 하는 데 사용할 수 있습니다 .
참고 URL : https://stackoverflow.com/questions/2654281/how-to-remove-exif-data-without-recompressing-the-jpeg
'IT' 카테고리의 다른 글
| SimpleXML에서 @attribute에 액세스 (0) | 2020.08.04 |
|---|---|
| TSQL에서 JSON 구문 분석 (0) | 2020.08.04 |
| Laravel 5+에서 클라이언트 IP 주소를 얻는 방법은 무엇입니까? (0) | 2020.08.04 |
| 처음에 1 = 1을 사용하는 것보다 SQL WHERE 절을 동적으로 작성하는 더 좋은 방법이 있습니까? (0) | 2020.08.04 |
| 네트워크 연결을 어떻게 확인합니까? (0) | 2020.08.04 |