watermark_data.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package main
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/base64"
  6. "fmt"
  7. "io/ioutil"
  8. "os"
  9. )
  10. func watermarkData() ([]byte, imageType, context.CancelFunc, error) {
  11. if len(conf.WatermarkData) > 0 {
  12. data, imgtype, err := base64WatermarkData()
  13. return data, imgtype, func() {}, err
  14. }
  15. if len(conf.WatermarkPath) > 0 {
  16. data, imgtype, err := fileWatermarkData()
  17. return data, imgtype, func() {}, err
  18. }
  19. if len(conf.WatermarkURL) > 0 {
  20. return remoteWatermarkData()
  21. }
  22. return nil, imageTypeUnknown, func() {}, nil
  23. }
  24. func base64WatermarkData() ([]byte, imageType, error) {
  25. data, err := base64.StdEncoding.DecodeString(conf.WatermarkData)
  26. if err != nil {
  27. return nil, imageTypeUnknown, fmt.Errorf("Can't decode watermark data: %s", err)
  28. }
  29. imgtype, err := checkTypeAndDimensions(bytes.NewReader(data))
  30. if err != nil {
  31. return nil, imageTypeUnknown, fmt.Errorf("Can't decode watermark: %s", err)
  32. }
  33. return data, imgtype, nil
  34. }
  35. func fileWatermarkData() ([]byte, imageType, error) {
  36. f, err := os.Open(conf.WatermarkPath)
  37. if err != nil {
  38. return nil, imageTypeUnknown, fmt.Errorf("Can't read watermark: %s", err)
  39. }
  40. imgtype, err := checkTypeAndDimensions(f)
  41. if err != nil {
  42. return nil, imageTypeUnknown, fmt.Errorf("Can't decode watermark: %s", err)
  43. }
  44. // Return to the beginning of the file
  45. f.Seek(0, 0)
  46. data, err := ioutil.ReadAll(f)
  47. if err != nil {
  48. return nil, imageTypeUnknown, fmt.Errorf("Can't read watermark: %s", err)
  49. }
  50. return data, imgtype, nil
  51. }
  52. func remoteWatermarkData() ([]byte, imageType, context.CancelFunc, error) {
  53. ctx := context.WithValue(context.Background(), imageURLCtxKey, conf.WatermarkURL)
  54. ctx, cancel, err := downloadImage(ctx)
  55. if err != nil {
  56. return nil, imageTypeUnknown, cancel, fmt.Errorf("Can't download watermark: %s", err)
  57. }
  58. return getImageData(ctx).Bytes(), getImageType(ctx), cancel, err
  59. }