厚土Go学习笔记 | 37. 图片(image)生成器

图片的操控有点复杂。Image类型有一些必要的方法必须实现。而 Image 本身也要构建一个最简单的结构体,包含图片的宽和高。

我们实现一个给定了大小的图片,然后把这个图片输出。

图片基本的结构和方法

type Image struct{
    width  int
    height int
}

func (img Image) ColorModel() color.Model {
    return color.RGBAModel
}

func (img Image) Bounds() image.Rectangle {
    return image.Rect(0, 0, img.width, img.height)
}

func (img Image) At(x, y int) color.Color {
    return color.RGBA{uint8(x), uint8(y), uint8(255), uint8(255)}
}

图片输出的方法

func Show(f func(int, int) [][]uint8) {
    const (
        dx = 256
        dy = 256
    )
    data := f(dx, dy)
    m := image.NewNRGBA(image.Rect(0, 0, dx, dy))
    for y := 0; y < dy; y++ {
        for x := 0; x < dx; x++ {
            v := data[y][x]
            i := y*m.Stride + x*4
            m.Pix[i] = v
            m.Pix[i+1] = v
            m.Pix[i+2] = 255
            m.Pix[i+3] = 255
        }
    }
    ShowImage(m)
}

func ShowImage(m image.Image) {
    var buf bytes.Buffer
    err := png.Encode(&buf, m)
    if err != nil {
        panic(err)
    }
    enc := base64.StdEncoding.EncodeToString(buf.Bytes())
    fmt.Println("IMAGE:" + enc)
}

在 22篇我们实现过一个图片程序,本篇的完整代码如下。你可以两篇对比着看有何区别。

package main

import (
    "bytes"
    "encoding/base64"
    "fmt"
    "image"
    "image/png"
    "image/color"
)

func Show(f func(int, int) [][]uint8) {
    const (
        dx = 256
        dy = 256
    )
    data := f(dx, dy)
    m := image.NewNRGBA(image.Rect(0, 0, dx, dy))
    for y := 0; y < dy; y++ {
        for x := 0; x < dx; x++ {
            v := data[y][x]
            i := y*m.Stride + x*4
            m.Pix[i] = v
            m.Pix[i+1] = v
            m.Pix[i+2] = 255
            m.Pix[i+3] = 255
        }
    }
    ShowImage(m)
}

func ShowImage(m image.Image) {
    var buf bytes.Buffer
    err := png.Encode(&buf, m)
    if err != nil {
        panic(err)
    }
    enc := base64.StdEncoding.EncodeToString(buf.Bytes())
    fmt.Println("IMAGE:" + enc)
}

type Image struct{
    width  int
    height int
}

func (img Image) ColorModel() color.Model {
    return color.RGBAModel
}

func (img Image) Bounds() image.Rectangle {
    return image.Rect(0, 0, img.width, img.height)
}

func (img Image) At(x, y int) color.Color {
    return color.RGBA{uint8(x), uint8(y), uint8(255), uint8(255)}
}

func main() {
    m := Image{500,500}
    ShowImage(m)
}

输出的结果

图片宽高都是500

图片宽高都是255

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2018-01-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AzMark

Matplotlib 系列之「绘制函数图像」

matplotlib 是 python 最著名的绘图库,它提供了一整套和 matlab 相似的命令 API,十分适合交互式进行绘图。

14620
来自专栏机器学习原理

我的机器学习matplotlib篇导入画出第一个图形颜色,标记,线型刻度、标题、标签和图例!创建子图

前言: matplotlib是python最常用的绘图库,能帮你画出美丽的各种图 导入 包含了中文显示,屏外显示 import matplotlib.p...

42660
来自专栏开源项目

Git 项目推荐 | 图片验证码生成库

一个简单的Go语言实现的验证码。 图片实例 ? ? ? ? 简介 基于Golang实现的图片验证码生成库,可以实现随机字母个数,随机直线,随机噪点等。可以设置...

49660
来自专栏逍遥剑客的游戏开发

Direct3D学习(一):3D Sierpinski镂垫绘制

22490
来自专栏Python小屋

Python实现批量图片添加数字水印

之前写过一个类似的代码,是把水印信息打散以后随机添加到原图中,并提供了水印信息的提取功能,请参考:Python实现图像空域随机水印加入与提取。本文代码功能:为指...

51430
来自专栏非著名程序员

基础篇章:关于 React Native 之 Slider 组件的讲解

(友情提示:RN学习,从最基础的开始,大家不要嫌弃太基础,会的同学请自行略过,希望不要耽误已经会的同学的宝贵时间) 来,讲这个组件之前,我们先学习一下英文单词,...

33080
来自专栏腾讯NEXT学位

药药切克闹!用酷炫的vue~制作酷炫的menu~

42650
来自专栏我是业余自学C/C++的

Excel求百分比

19130
来自专栏京东技术

服务器端的图像处理 | 请召唤ImageMagick助你解忧

在客户端我们可以用 PhotoShop 等 GUI 工具处理静态图片或者动态 GIF 图片,不过在服务器端对于 WEB 应用程序要处理图片格式转换,缩放裁剪,翻...

51610
来自专栏三十课

【图片版】CSS网格布局(Grid)完全教程

CSS网格布局(Grid)是一套二维的页面布局系统,它的出现将完全颠覆页面布局的传统方式。传统的CSS页面布局 一直不够理想。包括table布局、浮动、定位及内...

488100

扫码关注云+社区

领取腾讯云代金券