summaryrefslogtreecommitdiff
path: root/picture.go
diff options
context:
space:
mode:
authorxuri <xuri.me@gmail.com>2019-03-26 11:09:39 +0800
committerGitHub <noreply@github.com>2019-03-26 11:09:39 +0800
commiteca66180f191ba1209e5d50859be51eec7954281 (patch)
tree7d691000cc2833989d8f5d37c201732b6b82f0f0 /picture.go
parentf0244c00161ad6372ceb1ec951f3a82c741cd46a (diff)
parenta94dcb9918b5fec133faf5df65144d48e8722ca8 (diff)
resolve #359, optimize for saving duplicate images
Do not save duplicate images
Diffstat (limited to 'picture.go')
-rw-r--r--picture.go21
1 files changed, 15 insertions, 6 deletions
diff --git a/picture.go b/picture.go
index 9a9ff09..16572d4 100644
--- a/picture.go
+++ b/picture.go
@@ -151,10 +151,10 @@ func (f *File) AddPictureFromBytes(sheet, cell, format, name, extension string,
xlsx := f.workSheetReader(sheet)
// Add first picture for given sheet, create xl/drawings/ and xl/drawings/_rels/ folder.
drawingID := f.countDrawings() + 1
- pictureID := f.countMedia() + 1
drawingXML := "xl/drawings/drawing" + strconv.Itoa(drawingID) + ".xml"
drawingID, drawingXML = f.prepareDrawing(xlsx, drawingID, sheet, drawingXML)
- drawingRID := f.addDrawingRelationships(drawingID, SourceRelationshipImage, "../media/image"+strconv.Itoa(pictureID)+ext, hyperlinkType)
+ mediaStr := ".." + strings.TrimPrefix(f.addMedia(file, ext), "xl")
+ drawingRID := f.addDrawingRelationships(drawingID, SourceRelationshipImage, mediaStr, hyperlinkType)
// Add picture with hyperlink.
if formatSet.Hyperlink != "" && formatSet.HyperlinkType != "" {
if formatSet.HyperlinkType == "External" {
@@ -166,7 +166,6 @@ func (f *File) AddPictureFromBytes(sheet, cell, format, name, extension string,
if err != nil {
return err
}
- f.addMedia(file, ext)
f.addContentTypePart(drawingID, "drawings")
return err
}
@@ -363,12 +362,22 @@ func (f *File) countMedia() int {
return count
}
-// addMedia provides a function to add picture into folder xl/media/image by
-// given file and extension name.
-func (f *File) addMedia(file []byte, ext string) {
+// addMedia provides a function to add a picture into folder xl/media/image by
+// given file and extension name. Duplicate images are only actually stored once
+// and drawings that use it will reference the same image.
+func (f *File) addMedia(file []byte, ext string) string {
count := f.countMedia()
+ for name, existing := range f.XLSX {
+ if !strings.HasPrefix(name, "xl/media/image") {
+ continue
+ }
+ if bytes.Equal(file, existing) {
+ return name
+ }
+ }
media := "xl/media/image" + strconv.Itoa(count+1) + ext
f.XLSX[media] = file
+ return media
}
// setContentTypePartImageExtensions provides a function to set the content