watermark_data.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "fmt"
  6. "os"
  7. )
  8. func getWatermarkData() (*imageData, error) {
  9. if len(conf.WatermarkData) > 0 {
  10. return base64WatermarkData(conf.WatermarkData)
  11. }
  12. if len(conf.WatermarkPath) > 0 {
  13. return fileWatermarkData(conf.WatermarkPath)
  14. }
  15. if len(conf.WatermarkURL) > 0 {
  16. return remoteWatermarkData(conf.WatermarkURL)
  17. }
  18. return nil, nil
  19. }
  20. func base64WatermarkData(encoded string) (*imageData, error) {
  21. data, err := base64.StdEncoding.DecodeString(encoded)
  22. if err != nil {
  23. return nil, fmt.Errorf("Can't decode watermark data: %s", err)
  24. }
  25. imgtype, err := checkTypeAndDimensions(bytes.NewReader(data))
  26. if err != nil {
  27. return nil, fmt.Errorf("Can't decode watermark: %s", err)
  28. }
  29. return &imageData{Data: data, Type: imgtype}, nil
  30. }
  31. func fileWatermarkData(path string) (*imageData, error) {
  32. f, err := os.Open(path)
  33. if err != nil {
  34. return nil, fmt.Errorf("Can't read watermark: %s", err)
  35. }
  36. fi, err := f.Stat()
  37. if err != nil {
  38. return nil, fmt.Errorf("Can't read watermark: %s", err)
  39. }
  40. imgdata, err := readAndCheckImage(f, int(fi.Size()))
  41. if err != nil {
  42. return nil, fmt.Errorf("Can't read watermark: %s", err)
  43. }
  44. return imgdata, err
  45. }
  46. func remoteWatermarkData(imageURL string) (*imageData, error) {
  47. res, err := requestImage(imageURL)
  48. if res != nil {
  49. defer res.Body.Close()
  50. }
  51. if err != nil {
  52. return nil, fmt.Errorf("Can't download watermark: %s", err)
  53. }
  54. imgdata, err := readAndCheckImage(res.Body, int(res.ContentLength))
  55. if err != nil {
  56. return nil, fmt.Errorf("Can't download watermark: %s", err)
  57. }
  58. return imgdata, err
  59. }