rewriteWithAlternateAppSegments static method

dynamic rewriteWithAlternateAppSegments({
  1. required Uint8List jpegToWrite,
  2. required Uint8List jpegWithAppSegmentsToUse,
  3. required EventSink<List<int>> writer,
})

Writes out a JPEG but uses the APP segments from another JPEG Useful in preserving EXIF data

Implementation

static rewriteWithAlternateAppSegments({
  required Uint8List jpegToWrite,
  required Uint8List jpegWithAppSegmentsToUse,
  required EventSink<List<int>> writer,
}) {
  var segments = readHeaders(jpegToWrite);
  var appSegments =
      readHeaders(jpegWithAppSegmentsToUse).where((s) => s.isApp);

  void writeSegment(JpegSegment seg) {
    writer.add(seg.data.buffer
        .asUint8List(seg.data.offsetInBytes, seg.data.lengthInBytes));
  }

  for (var seg in segments) {
    if (seg.isApp) {
      // skip APP segments in source image
      continue;
    }
    if (seg.isStartOfScan) {
      // write the rest of the file
      writer.add(seg.data.buffer.asUint8List(seg.data.offsetInBytes));
      break;
    }

    writeSegment(seg);

    if (seg.shortName == "SOI") {
      // write APP segments after SOI,
      // as per the JFIF/EXIF standards
      appSegments.forEach(writeSegment);
    }
  }
}