zoukankan      html  css  js  c++  java
  • 用GO扫描图片像素,复制图片

    关键是使用image、image/png、image/color包

    // main.go
    package main
    
    import (
    	"fmt"
    
    	"bufio"
    	"image"
    
    	"image/png"
    
    	"image/color"
    	"io/ioutil"
    	"log"
    	"os"
    )
    
    var picWidth, picHeight int
    var rgbaDataList [][]color.Color
    
    func main() {
    	readPncPic()
    }
    
    func readPncPic() {
    
    	//读取本地文件
    	f, err := os.Open("/Users/jiading/Documents/whiteblack.png")
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer f.Close()
    	g, _, err := image.Decode(bufio.NewReader(f))
    	if err != nil {
    		log.Fatal(err)
    		return
    	}
    
    	rect := g.Bounds()
    	size := rect.Size()
    
    	picWidth = size.X
    	picHeight = size.Y
    
    	fmt.Printf("图片宽度: %d __ 图片高度: %d
    ", picWidth, picHeight)
    
    	rgbaDataList = [][]color.Color{}
    
    	for y := 0; y < picHeight; y++ {
    
    		rgbaDataSingleList := []color.Color{}
    		for x := 0; x < picWidth; x++ {
    			pixelItem := g.At(x, y)
    			r0, _, _, _ := pixelItem.RGBA()
    			if r0 == 0x0000 {
    				//white 0
    			} else if r0 == 0xffff {
    
    				//black 1
    			}
    			rgbaDataSingleList = append(rgbaDataSingleList, pixelItem)
    		}
    		rgbaDataList = append(rgbaDataList, rgbaDataSingleList)
    	}
    
    	//	writeLocalFile(pixelData, txtName)
    
    	writePngFile()
    }
    
    func writePngFile() {
    
    	//创建新图片
    	f, err := os.Create("/Users/jiading/Documents/copypic.png")
    	if err != nil {
    		fmt.Println(err)
    		os.Exit(1)
    	}
    
    	m := image.NewNRGBA(image.Rectangle{Min: image.Point{0, 0}, Max: image.Point{picWidth, picHeight}})
    	for y := 0; y < picHeight; y++ {
    		list1 := rgbaDataList[y]
    
    		for x := 0; x < picWidth; x++ {
    			r0, g0, b0, a0 := list1[x].RGBA()
    			m.SetNRGBA(x, y, color.NRGBA{uint8(r0), uint8(g0), uint8(b0), uint8(a0)})
    
    		}
    	}
    	if err = png.Encode(f, m); err != nil {
    		fmt.Println(err)
    		os.Exit(1)
    	}
    
    }
    
    func writeLocalFile(val string, filePath string) bool {
    
    	var content = []byte(val)
    	err := ioutil.WriteFile(filePath, content, 0644)
    	if err != nil {
    		fmt.Printf("%s
    ", err)
    		panic(err)
    		return false
    	}
    
    	fmt.Println("==写文件成功: " + filePath + "==")
    	return true
    
    }
    

    ====================================================================================================================

    2017_7_16,在win10上测试读取png图片信息时返回错误unkown format类似语句,是因为用到了image.Decode(),改成png.Decode()即可在win10上跑起来。

  • 相关阅读:
    codevs 1115 开心的金明
    POJ 1125 Stockbroker Grapevine
    POJ 2421 constructing roads
    codevs 1390 回文平方数 USACO
    codevs 1131 统计单词数 2011年NOIP全国联赛普及组
    codevs 1313 质因数分解
    洛谷 绕钉子的长绳子
    洛谷 P1276 校门外的树(增强版)
    codevs 2627 村村通
    codevs 1191 数轴染色
  • 原文地址:https://www.cnblogs.com/JD85/p/4968867.html
Copyright © 2011-2022 走看看