image.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package image
  2. import (
  3. "fmt"
  4. "image"
  5. "image/gif"
  6. "image/jpeg"
  7. "image/png"
  8. "log"
  9. "os"
  10. "strings"
  11. )
  12. // @title LoadImage
  13. // @description 读取图片内容
  14. // @param
  15. // @return
  16. func LoadImage(imgPath string) (image.Image, error) {
  17. var img image.Image
  18. var err error
  19. f, err := os.Open(imgPath)
  20. if err != nil {
  21. log.Printf("os.Open error : %v\n", err)
  22. return nil, err
  23. }
  24. defer f.Close()
  25. if strings.HasSuffix(imgPath, "jpg") || strings.HasSuffix(imgPath, "jpeg") {
  26. img, err = jpeg.Decode(f)
  27. } else if strings.HasSuffix(imgPath, "png") {
  28. img, err = png.Decode(f)
  29. } else if strings.HasSuffix(imgPath, "gif") {
  30. img, err = gif.Decode(f)
  31. } else {
  32. return nil, fmt.Errorf("当前图片格式不支持")
  33. }
  34. return img, err
  35. }
  36. // @title WriteImage
  37. // @description image数据写入图片文件
  38. // @param
  39. // @return
  40. func WriteImage(imgPath string, imgData *image.RGBA) error {
  41. //打开新新图片文件
  42. f, err := os.Create(imgPath)
  43. if err != nil {
  44. log.Printf("%v, Create error : %v\n", imgPath, err)
  45. return err
  46. }
  47. defer f.Close()
  48. //写入图片文件
  49. png.Encode(f, imgData)
  50. return err
  51. }
  52. // @title TrimImg
  53. // @description 裁剪图片,去除四周空白部分
  54. // @param
  55. // @return
  56. func TrimImg(imgPath, subImgPath string) error {
  57. img, err := LoadImage(imgPath)
  58. if err != nil {
  59. log.Printf("LoadImage error : %v\n", err)
  60. return err
  61. }
  62. bounds := img.Bounds()
  63. width, height := bounds.Max.X, bounds.Max.Y
  64. fmt.Printf("width,height=============>%v,%v\n", width, height)
  65. var x, y int
  66. var wx, wy int //切割点的x和y
  67. //遍历宽
  68. for x = 0; x < width; x++ {
  69. //遍历高
  70. for y = 0; y < height; y++ {
  71. r, g, b, _ := img.At(x, y).RGBA()
  72. //fmt.Printf("r,g,b========>%v,%v,%v\n", int(r/257), int(g/257), int(b/257))
  73. //判断当前坐标是否大于切割点坐标 , todo 为啥要除以257呢?
  74. if int(r/257) < 255 && int(g/257) < 255 && int(b/257) < 255 && x >= wx && y >= wy {
  75. wx = x
  76. wy = y
  77. }
  78. }
  79. }
  80. fmt.Printf("wx,wy===========>%v,%v\n", wx, wy)
  81. rgbImg := img.(*image.RGBA)
  82. subImg := rgbImg.SubImage(image.Rect(0, 0, wx, wy)).(*image.RGBA)
  83. WriteImage(subImgPath, subImg)
  84. //fmt.Printf("%v %v %v\n", r, g, b)
  85. //
  86. //hex:=fmt.Sprintf("%s%s%s",
  87. // t2x(int64(r)),
  88. // t2x(int64(g)),
  89. // t2x(int64(b)),
  90. // )
  91. //println(hex)
  92. return nil
  93. }