first commit
This commit is contained in:
55
exif/exif.go
Normal file
55
exif/exif.go
Normal file
@@ -0,0 +1,55 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user