class EmbedXMP::JPEG

JPEG images

Constants

JPEG_AP1
JPEG_EXF
JPEG_IMG
JPEG_XMP

Public Instance Methods

join_sidecar(sidecar_file, xpacked: false) click to toggle source

Join an XMP sidecar file into the image file.

# File lib/embed_xmp/jpeg.rb, line 17
def join_sidecar(sidecar_file, xpacked: false)
  check_file_markers
  remove_xmp

  sidecar = read_io_or_string(sidecar_file)
  xmp_chunk = create_xmp_segment(sidecar, xpacked)

  insert_into_file(find_xmp_insertion_offset, xmp_chunk)
end
remove_xmp() click to toggle source
# File lib/embed_xmp/jpeg.rb, line 27
def remove_xmp
  offset = JFIF_SOI.length
  while offset < @image_data.length
    marker, length, = segment(offset)

    break if [JPEG_IMG, JFIF_END, nil].include?(marker)

    if segment_is_app1_xmp(offset, marker)
      remove_segment(offset)
      next
    end

    offset += length
  end
end

Private Instance Methods

create_xmp_segment(xmp, xpacked) click to toggle source
# File lib/embed_xmp/jpeg.rb, line 72
def create_xmp_segment(xmp, xpacked)
  data = JPEG_XMP +
         EmbedXMP::XMP
         .new(xmp, writable: true, xpacked: xpacked)
         .to_s.gsub("\0", ' ')

  new_segment(JPEG_AP1, data.b)
end
find_xmp_insertion_offset() click to toggle source
# File lib/embed_xmp/jpeg.rb, line 45
def find_xmp_insertion_offset
  offset = JFIF_SOI.length
  cursor = offset
  while offset < @image_data.length
    marker, length, = segment(offset)

    break if [JPEG_IMG, JFIF_END, nil].include?(marker)

    if segment_is_app1_exif(offset, marker)
      cursor = offset + length
      break
    end

    offset += length
  end

  cursor
end
segment_is_app1_exif(off, seg) click to toggle source
# File lib/embed_xmp/jpeg.rb, line 64
def segment_is_app1_exif(off, seg)
  JPEG_AP1 == seg && @image_data[off + 4, JPEG_EXF.length].b == JPEG_EXF
end
segment_is_app1_xmp(off, seg) click to toggle source
# File lib/embed_xmp/jpeg.rb, line 68
def segment_is_app1_xmp(off, seg)
  JPEG_AP1 == seg && @image_data[off + 4, JPEG_XMP.length + 4].b == JPEG_XMP
end