package exif import "io" type ( writerSkipper struct { io.Writer bytesToSkip int } ) func NewWriterExif(w io.Writer, exif []byte) (io.Writer, error) { writer := &writerSkipper{ Writer: w, bytesToSkip: 2, } soi := []byte{0xff, 0xd8} if _, err := w.Write(soi); err != nil { return nil, err } if exif != nil { app1Marker := 0xe1 markerlen := 2 + len(exif) marker := []byte{0xff, uint8(app1Marker), uint8(markerlen >> 8), uint8(markerlen & 0xff)} if _, err := w.Write(marker); err != nil { return nil, err } if _, err := w.Write(exif); err != nil { return nil, err } } return writer, nil } func (w *writerSkipper) Write(data []byte) (int, error) { if w.bytesToSkip <= 0 { return w.Writer.Write(data) } if dataLen := len(data); dataLen < w.bytesToSkip { w.bytesToSkip -= dataLen return dataLen, nil } if n, err := w.Writer.Write(data[w.bytesToSkip:]); err == nil { n += w.bytesToSkip w.bytesToSkip = 0 return n, nil } else { return n, err } }