go语言jpeg.Decode图片后会发生旋转
go语言的jpeg.Decode方法解码一个6720X4480的图像后,调用Bounds方法发现图像发生旋转90度了,
但是我在读取一个小图时却不会发生旋转,也就是说,解码后图像旋转并不是在所有图片上都会发生!
那该如何检查解码后的图像是否发生了旋转和旋转了多少度?
附上我的代码:(代码的功能是批量给图添加水印)
package main
import (
"flag"
"fmt"
"image"
"image/draw"
"image/jpeg"
"image/png"
"io/ioutil"
"log"
"math/rand"
"os"
"strings"
)
var (
source string
dest string
water string
position int
waterImg image.Image
)
func main() {
files, err := ioutil.ReadDir(source)
if err != nil {
log.Fatalln(err)
}
for _, img := range files {
if !strings.HasSuffix(img.Name(), "jpg") {
continue
}
mark(img)
}
}
func mark(img os.FileInfo) {
fp, err := os.Open(fmt.Sprintf("%s/%s", source, img.Name()))
if err != nil {
log.Println(err)
return
}
defer fp.Close()
imgDec, err := jpeg.Decode(fp)
if err != nil {
log.Println(err)
return
}
imgb := imgDec.Bounds()
rotate270 := image.NewRGBA(image.Rect(0, 0, imgb.Bounds().Dy(), imgb.Bounds().Dx()))
for x := imgb.Min.Y; x < imgb.Max.Y; x++ {
for y := imgb.Max.X - 1; y >= imgb.Min.X; y-- {
rotate270.Set(x, imgb.Max.X-y, imgDec.At(y, x))
}
}
b := rotate270.Bounds()
newImg := image.NewRGBA(b)
offset := getWaterPos(rotate270, position)
draw.Draw(newImg, b, rotate270, image.ZP, draw.Src)
draw.Draw(newImg, waterImg.Bounds().Add(offset), waterImg, image.ZP, draw.Over)
imgOut, err := os.Create(dest + "/" + img.Name())
if err != nil {
log.Println(err)
return
}
defer imgOut.Close()
jpeg.Encode(imgOut, newImg, &jpeg.Options{Quality: 100})
}
func getWaterPos(img image.Image, pos int) image.Point {
var X, Y int
X = int(float32(img.Bounds().Dx()) * 0.05)
Y = int(float32(img.Bounds().Dy()) * 0.05)
var offset image.Point
switch pos {
case 5:
offset = image.Pt(img.Bounds().Dx()/2-waterImg.Bounds().Dx()/2, img.Bounds().Dy()/2-waterImg.Bounds().Dy()/2)
case 4:
offset = image.Pt(img.Bounds().Dx()-waterImg.Bounds().Dx()-X, img.Bounds().Dy()-waterImg.Bounds().Dy()-Y)
case 3:
offset = image.Pt(X, img.Bounds().Dy()-waterImg.Bounds().Dy()-Y)
case 1:
offset = image.Pt(X, Y)
case 2:
offset = image.Pt(img.Bounds().Dx()-waterImg.Bounds().Dx()-X, Y)
default:
offset = image.Pt(rand.Intn(img.Bounds().Dx()-waterImg.Bounds().Dx()-2*X)+X, rand.Intn(img.Bounds().Dy()-waterImg.Bounds().Dy()-2*Y)+Y)
}
return offset
}
func init() {
flag.StringVar(&source, "s", "", "待处理源图片所在目录")
flag.StringVar(&dest, "o", "", "处理完毕后图片输出目录")
flag.IntVar(&position, "p", 0, "水印位置:0随机,1左上,2右上,3左下,4右下,5居中")
flag.StringVar(&water, "w", "", "水印图片")
flag.Parse()
if source == "" {
log.Fatalln("请输入源图片目录")
}
if dest == "" {
log.Fatalln("请输入输出目录")
}
if water == "" {
log.Fatalln("请输入水印图片")
}
_, err := os.Stat(dest)
if err != nil {
os.Mkdir(dest, os.ModePerm)
}
fp, err := os.Open(water)
if err != nil {
log.Fatalln(err)
}
defer fp.Close()
waterImg, err = png.Decode(fp)
if err != nil {
log.Fatalln(err)
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
小图片是 网上的图片?大图片是 手机照片?
6720 x 4480 看着是相机的照片
参考下这个:相机获取的照片向左自动旋转90度解决方法