go语言jpeg.Decode图片后会发生旋转

发布于 2022-09-11 17:02:57 字数 3372 浏览 24 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

几味少女 2022-09-18 17:02:57

小图片是 网上的图片?大图片是 手机照片?

6720 x 4480 看着是相机的照片
参考下这个:相机获取的照片向左自动旋转90度解决方法

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文