#922 exiv2 -dI deletes all IPTC chunks in a JPEG.

This commit is contained in:
Robin Mills 2016-08-25 16:20:38 +00:00
parent 8a089d28cc
commit 13be017d12
3 changed files with 69 additions and 22 deletions

View File

@ -452,7 +452,7 @@ namespace Exiv2 {
--search;
}
else if ( !foundIccProfile && marker == app2_ ) {
// Seek to beginning and read the iccProfile
// Seek to beginning and read the iccProfile
io_->seek(31 - bufRead, BasicIo::cur);
DataBuf iccProfile(size);
io_->read(iccProfile.pData_, iccProfile.size_);
@ -623,13 +623,13 @@ namespace Exiv2 {
// http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart3.pdf p75
const char* signature = (const char*) buf.pData_+2;
// 728 rmills@rmillsmbp:~/gnu/exiv2/ttt $ exiv2 -pS test/data/exiv2-bug922.jpg
// STRUCTURE OF JPEG FILE: test/data/exiv2-bug922.jpg
// address | marker | length | data
// 2 | 0xd8 SOI | 0
// 4 | 0xe1 APP1 | 911 | Exif..MM.*.......%.........#....
// 917 | 0xe1 APP1 | 870 | http://ns.adobe.com/xap/1.0/.<x:
// 1789 | 0xe1 APP1 | 65460 | http://ns.adobe.com/xmp/extensio
// 728 rmills@rmillsmbp:~/gnu/exiv2/ttt $ exiv2 -pS test/data/exiv2-bug922.jpg
// STRUCTURE OF JPEG FILE: test/data/exiv2-bug922.jpg
// address | marker | length | data
// 2 | 0xd8 SOI | 0
// 4 | 0xe1 APP1 | 911 | Exif..MM.*.......%.........#....
// 917 | 0xe1 APP1 | 870 | http://ns.adobe.com/xap/1.0/.<x:
// 1789 | 0xe1 APP1 | 65460 | http://ns.adobe.com/xmp/extensio
if ( option == kpsXMP && std::string(signature).find("http://ns.adobe.com/x")== 0 ) {
// extract XMP
if ( size > 0 ) {
@ -732,10 +732,10 @@ namespace Exiv2 {
if ( bPS ) {
IptcData::printStructure(out,exif,size,depth);
} else {
// create a copy on write memio object with the data, then print the structure
BasicIo::AutoPtr p = BasicIo::AutoPtr(new MemIo(exif+start,size-start));
if ( start < max ) TiffImage::printTiffStructure(*p,out,option,depth);
}
// create a copy on write memio object with the data, then print the structure
BasicIo::AutoPtr p = BasicIo::AutoPtr(new MemIo(exif+start,size-start));
if ( start < max ) TiffImage::printTiffStructure(*p,out,option,depth);
}
// restore and clean up
io_->seek(restore,Exiv2::BasicIo::beg);
@ -765,13 +765,62 @@ namespace Exiv2 {
}
}
}
if ( option == kpsIptcErase ) {
std::cout << "iptc data blocks: " << (iptcDataSegs.size() ? "FOUND" : "none") << std::endl;
uint32_t toggle = 0 ;
for ( Uint32Vector_i it = iptcDataSegs.begin(); it != iptcDataSegs.end() ; it++ ) {
std::cout << *it ;
if ( toggle++ % 2 ) std::cout << std::endl; else std::cout << ' ' ;
}
if ( option == kpsIptcErase && iptcDataSegs.size() ) {
#ifdef DEBUG
std::cout << "iptc data blocks: " << iptcDataSegs.size() << std::endl;
uint32_t toggle = 0 ;
for ( Uint32Vector_i it = iptcDataSegs.begin(); it != iptcDataSegs.end() ; it++ ) {
std::cout << *it ;
if ( toggle++ % 2 ) std::cout << std::endl; else std::cout << ' ' ;
}
#endif
uint64_t count = iptcDataSegs.size();
// figure out which blocks to copy
uint64_t* pos = new uint64_t[count+2];
pos[0] = 0 ;
// copy the data that is not iptc
Uint32Vector_i it = iptcDataSegs.begin();
for ( uint64_t i = 0 ; i < count ; i++ ) {
bool bOdd = i%2;
bool bEven = !bOdd;
pos[i+1] = bEven ? *it : pos[i] + *it;
it++;
}
pos[count+1] = io_->size() - pos[count];
#ifdef DEBUG
for ( uint64_t i = 0 ; i < count+2 ; i++ ) std::cout << pos[i] << " " ;
std::cout << std::endl;
#endif
// $ dd bs=1 skip=$((0)) count=$((13164)) if=ETH0138028.jpg of=E1.jpg
// $ dd bs=1 skip=$((49304)) count=2000000 if=ETH0138028.jpg of=E2.jpg
// cat E1.jpg E2.jpg > E.jpg
// exiv2 -pS E.jpg
// binary copy io_ to a temporary file
BasicIo::AutoPtr tempIo(io_->temporary()); // may throw
assert (tempIo.get() != 0);
for ( uint64_t i = 0 ; i < (count/2)+1 ; i++ ) {
uint64_t start = pos[2*i]+2 ; // step JPG 2 byte marker
if ( start == 2 ) start = 0 ; // read the file 2 byte SOI
uint64_t length = pos[2*i+1] - start;
if ( length ) {
#ifdef DEBUG
std::cout << start <<":"<< length << std::endl;
#endif
io_->seek(start,BasicIo::beg);
DataBuf buf(length);
io_->read(buf.pData_,buf.size_);
tempIo->write(buf.pData_,buf.size_);
}
}
delete [] pos;
io_->seek(0, BasicIo::beg);
io_->transfer(*tempIo); // may throw
io_->seek(0, BasicIo::beg);
readMetadata();
}
}
@ -1022,7 +1071,7 @@ namespace Exiv2 {
us2Data(tmpBuf + 2, static_cast<uint16_t>(iccProfile_.size_), bigEndian);
if (outIo.write(tmpBuf, 4) != 4) throw Error(21);
// Write new iccProfile
// Write new iccProfile
if ( outIo.write(iccProfile_.pData_,iccProfile_.size_) != static_cast<long>(iccProfile_.size_) ) throw Error(21);
if ( outIo.error() ) throw Error(21);
--search;

Binary file not shown.

View File

@ -289,7 +289,6 @@ STRUCTURE OF WEBP FILE: exiv2-bug1199.webp
VP8 | 172008 | 3184 | .G...*.. .>1..B.!..o.. ......]..
EXIF | 12040 | 175200 | II*........................... .
XMP | 2864 | 187248 | <?xpacket begin="..." id="W5M0Mp
Warning: Unsupported time format
STRUCTURE OF WEBP FILE: exiv2-bug1199.webp
Chunk | Length | Offset | Payload
RIFF | 187526 | 0 | WEBP
@ -306,7 +305,6 @@ STRUCTURE OF WEBP FILE: exiv2-bug1199.webp
VP8 | 172008 | 598 | .G...*.. .>1..B.!..o.. ......]..
EXIF | 12040 | 172614 | II*........................... .
XMP | 2864 | 184662 | <?xpacket begin="..." id="W5M0Mp
Warning: Unsupported time format
STRUCTURE OF WEBP FILE: exiv2-bug1199.webp
Chunk | Length | Offset | Payload
RIFF | 187526 | 0 | WEBP