void TiffImage::writeMetadata() { #ifdef DEBUG std::cerr << "Writing TIFF file " << io_->path() << "\n"; #endif // Read existing image ByteOrder bo = byteOrder(); DataBuf buf; if (io_->open() == 0) { IoCloser closer(*io_); // Ensure that this is the correct image type if (isTiffType(*io_, false)) { // Read the image into a memory buffer buf.alloc(io_->size()); io_->read(buf.pData_, buf.size_); if (io_->error() || io_->eof()) { buf.reset(); } TiffHeader tiffHeader; if (0 == tiffHeader.read(buf.pData_, 8)) { bo = tiffHeader.byteOrder(); } } } if (bo == invalidByteOrder) { bo = littleEndian; } setByteOrder(bo); Blob blob; WriteMethod wm = TiffParser::encode(blob, buf.pData_, buf.size_, bo, exifData_, iptcData_, xmpData_); // Write updated or new buffer to file BasicIo::AutoPtr tempIo(io_->temporary()); // may throw assert(tempIo.get() != 0); if (wm == wmNonIntrusive) { // Buffer may be modified but size is unchanged, write buffer back tempIo->write(buf.pData_, buf.size_); } else { // Size of the buffer changed, write from blob tempIo->write(&blob[0], static_cast<long>(blob.size())); } io_->close(); io_->transfer(*tempIo); // may throw } // TiffImage::writeMetadata
bool Nikon3MnHeader::read(const byte* pData, uint32_t size, ByteOrder /*byteOrder*/) { if (!pData || size < sizeOfSignature()) return false; if (0 != memcmp(pData, signature_, 6)) return false; buf_.alloc(sizeOfSignature()); std::memcpy(buf_.pData_, pData, buf_.size_); TiffHeader th; if (!th.read(buf_.pData_ + 10, 8)) return false; byteOrder_ = th.byteOrder(); start_ = 10 + th.offset(); return true; } // Nikon3MnHeader::read
int Nikon3MakerNote::readHeader(const byte* buf, long len, ByteOrder byteOrder) { if (len < 18) return 1; header_.alloc(18); memcpy(header_.pData_, buf, header_.size_); TiffHeader tiffHeader; tiffHeader.read(header_.pData_ + 10); byteOrder_ = tiffHeader.byteOrder(); start_ = 10 + tiffHeader.offset(); shift_ = 10; return 0; }