zoukankan      html  css  js  c++  java
  • golang中image/color包的用法

    color包是image包对于color重点介绍,实现了基本的颜色库

    color中定义了如下几个变量

    var (
        Black       = Gray16{0}
        White       = Gray16{0xffff}
        Transparent = Alpha16{0}
        Opaque      = Alpha16{0xffff}
    )

    func RGBToYCbCr(r, g, b uint8) (uint8, uint8, uint8) //RGBToYCbCr将RGB的三重色转换为Y'CbCr模型的三重色
    func YCbCrToRGB(y, cb, cr uint8) (uint8, uint8, uint8)  //YCbCrToRGB将Y'CbCr上的三重色转变成RGB的三重色。


    type Alpha       //Alpha代表一个8-bit的透明度。

    type Alpha struct {
    	A uint8
    }
    func (c Alpha) RGBA() (r, g, b, a uint32)


    type Alpha16       //Alpha16代表一个16位的透明度。

    type Alpha16 struct {
    	A uint16
    }
    func (c Alpha16) RGBA() (r, g, b, a uint32)

    预乘简单定义(预乘会在后面的定义中用到):

    什么是预乘?假设一个像素点,用RGBA四个分量来表示,记做(R,G,B,A),那预乘后的像素就是(R*A,G*A,B*A, A),这里A的取值范围是[0,1]。所以,预乘就是每个颜色分量都与该像素的alpha分量预先相乘。可以发现,对于一个没有透明度,或者说透明度为1的像素来说,预乘不预乘结果都是一样的。

    type Color      //Color可以将它自己转化成每个RGBA通道都预乘透明度。这种转化可能是有损的。任何实现RGBA()方法的结构体都实现了Color接口

    type Color interface {
    
    	// RGBA返回预乘透明度的红,绿,蓝和颜色的透明度。每个值都在[0, 0xFFFF]范围内,
    	// 但是每个值都被uint32代表,这样可以乘以一个综合值来保证不会达到0xFFFF而溢出。
    	RGBA() (r, g, b, a uint32)
    }

    type Gray     //Gray代表一个8-bit的灰度。

    type Gray struct {
    	Y uint8
    }
    

    func (c Gray) RGBA() (r, g, b, a uint32)


    type Gray16         //Gray16代表了一个16-bit的灰度。

    type Gray struct {
    	Y uint16
    }
    func (c Gray16) RGBA() (r, g, b, a uint32)


    type Model         //Model接口实现了Convert方法,Model可以在它自己的颜色模型中将一种颜色转化到另一种。这种转换可能是有损的。

    type Model interface {
    	Convert(c Color) Color
    }
    
    其中基本的颜色模型Model如下所示:

    var (
    	RGBAModel    Model = ModelFunc(rgbaModel)
    	RGBA64Model  Model = ModelFunc(rgba64Model)
    	NRGBAModel   Model = ModelFunc(nrgbaModel)
    	NRGBA64Model Model = ModelFunc(nrgba64Model)
    	AlphaModel   Model = ModelFunc(alphaModel)
    	Alpha16Model Model = ModelFunc(alpha16Model)
    	GrayModel    Model = ModelFunc(grayModel)
    	Gray16Model  Model = ModelFunc(gray16Model)
    )
    
    而YCbCrModel是Y'CbCr颜色的模型

    var YCbCrModel Model = ModelFunc(yCbCrModel)

    func ModelFunc(f func(Color) Color) Model  //ModelFunc返回一个Model,它可以调用f来实现转换。


    type NRGBA            //NRGBA代表一个没有32位透明度加乘的颜色。每个红,绿,蓝和透明度都是8bit的数值

    type NRGBA struct {
    	R, G, B, A uint8
    }

    func (c NRGBA) RGBA() (r, g, b, a uint32)


    type NRGBA64         //NRGBA64代表无透明度加乘的64-bit的颜色,它的每个红,绿,蓝,和透明度都是个16bit的数值。

    type NRGBA struct {
    	R, G, B, A uint16
    }

    func (c NRGBA64) RGBA() (r, g, b, a uint32)


    type Palette         //Palette是颜色的调色板

    type Palette []Color

    func (p Palette) Convert(c Color) Color    //返回欧式r g b空间中最接近color c 的调色板颜色
    func (p Palette) Index(c Color) int   //Index在Euclidean R,G,B空间中找到最接近c的调色板对应的索引。


    type RGBA         //RGBA代表一个传统的32位的预乘透明度的颜色,它的每个红,绿,蓝,和透明度都是个8bit的数值。

    type RGBA struct {
    	R, G, B, A uint8
    }

    func (c RGBA) RGBA() (r, g, b, a uint32)


    type RGBA64       //RGBA64代表一个64位的预乘透明度的颜色,它的每个红,绿,蓝,和透明度都是个8bit的数值。

    type RGBA64 struct {
    	R, G, B, A uint16
    }

    func (c RGBA64) RGBA() (r, g, b, a uint32)


    type YCbCr        //YCbCr代表了完全不透明的24-bit的Y'CbCr的颜色,它的每个亮度和每两个色度分量是8位的。

    type YCbCr struct {
    	Y, Cb, Cr uint8
    }
    

    JPEG,VP8,MPEG家族和其他一些解码器使用这个颜色模式。每个解码器经常将YUV和Y'CbCr同等使用,但是严格来说,YUV只是用于分析视频信号,Y' (luma)是Y (luminance)伽玛校正之后的结果。

    RGB和Y'CbCr之间的转换是有损的,并且转换的时候有许多细微的不同。这个包是遵循JFIF的说明:http://www.w3.org/Graphics/JPEG/jfif3.pdf


    func (c YCbCr) RGBA() (r uint32,g uint32,b uint32,a uint32)
  • 相关阅读:
    git修改文件名大小写的方法。
    VC中常用的宏
    spring cloud Zuul 多层拦截 --- 心得
    Zuul网关 @EnableZuulProxy 和 @EnableZuulServer 的区别
    jave 数据类型 float 的 正确赋值
    spring cloud bus 消息总线 动态刷新配置文件 【actuator 与 RabbitMQ配合完成】
    RabbitMQ 消息中间件 的下载与安装【window10】
    spring cloud --- 使用 actuator 热更新【刷新】单机配置文件
    spring cloud 与spring boot的版本对应总结
    spring cloud feign 报错 feign.FeignException$MethodNotAllowed: status 405 reading 解决
  • 原文地址:https://www.cnblogs.com/msnsj/p/4242571.html
Copyright © 2011-2022 走看看