对jpg与png的缩放压缩-go语言实现

//image_resize.go
//如果是对gif进行缩放,需要对每帧缩放并对gif.Gif.Config中的尺寸进行缩放

package main

import (
	"os"
	"image"
	_ "image/gif"
	"log"
	_ "image/png"
	 "image/jpeg"
	"path/filepath"
	"strings"
	"regexp"
	"time"
	"math"
)

const vieux string="ori_image/"
func main(){
	log.Println("处理当前文件夹的图片,并把旧文件放入ori_image")
	_,err:=os.Stat(vieux)
	if err!=nil{
		log.Println(err)
		os.MkdirAll(vieux,0666)//8进制 要有0
	}
	m,_:=filepath.Glob("*")
	for _,name:=range m{//只列当前文件夹 不递归
		if regexp.MustCompile( (`\.(jpe?g|png)$`)).MatchString(strings.ToLower( name)) {
			resize(name)
		}
	}

}
func resize(name   string)	{
	f,_:=os.Open(name)
	defer f.Close()
	img,ty,_:=image.Decode(f)
	size:=img.Bounds().Dx()*img.Bounds().Dy()
	scale:=math.Sqrt(float64(size/3e6))	//保留300万像素
	scale=math.Max(1,scale)	//较小的PNG 保存原大小 不放大
	if ty!="jpeg"||scale>1.2{
		log.Println("即将处理:",name)
		var canvas image.Image
		if scale==1{
			canvas=img
		}else{
			w,h:=int(float64(img.Bounds().Dx())/scale),int(float64(img.Bounds().Dy())/scale)
			canvas:=image.NewRGBA(image.Rect(0,0,w,h))
			for row:=0;row<w;row++{
				for col:=0;col<h;col++{
					canvas.Set(row,col,img.At(int(float64(row)*scale),int(float64(col)*scale)))
				}
			}
		}
		
		f.Close()
		output,_:=os.Create(time.Now().Format("20060102_150405_")+"缩放"+name[:len(name)-4]+".jpg")
		jpeg.Encode(output,canvas,&jpeg.Options{70})
		err:=os.Rename(name,filepath.Join(vieux,name))
		echo_err(err)
		return
	}
}
func echo_err(err error){
	if  err!=nil{
		log.Println(err)
		panic(err)
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值