Documentation ¶
Overview ¶
Package gojpegturbo 封装libjpeg-turbo库,优化图片的缩放和剪裁。
简单的图片解码编码:
img, err := gojpegturbo.Decode(buf, nil) // modify img buf, err = gojpegturbo.Encode(img, nil)
图片缩放:
options := gojpegturbo.NewDecodeOptions() options.ExpectWidth = 50 options.ExpectHeight = 50 img, err := gojpegturbo.Decode(buf, options) // 注意,这里输出的 img 的长和宽总是大于或等于 expect 的尺寸,会在图片解码阶段尽量逼近需要,但一般不会刚好等于,需要使用 resize 函数继续缩小。 img = img.ResizeNN(50, 50) buf, err = gojpegturbo.Encode(img, nil)
图片剪裁:
options := gojpegturbo.NewDecodeOptions() options.CropRect = &image.Rectangle{ Min: image.Point{X: 100, Y: 200}, Max: image.Point{X: 300, Y: 621}, } // 这里输出的图片是已经剪裁好的。相比起其他图片解码库,优势在于解码的时候只解码感兴趣的 MCU 区域,大大节省 CPU 和内存。 img, err := gojpegturbo.Decode(buf, options) buf, err = gojpegturbo.Encode(img, nil)
Index ¶
- Constants
- Variables
- func Encode(img *ImageAttr, options *EncodeOptions) ([]byte, error)
- type ColorSpace
- type DctMethod
- type DecodeOptions
- type DitherMode
- type EncodeOptions
- type ImageAttr
- func (img *ImageAttr) At(x, y int) color.Color
- func (img *ImageAttr) Bounds() image.Rectangle
- func (img *ImageAttr) ColorModel() color.Model
- func (img *ImageAttr) PixelFormat() TJPixelFormat
- func (img *ImageAttr) ResizeArea(dstWidth, dstHeight int) (*ImageAttr, error)
- func (img *ImageAttr) ResizeBilinear(dstWidth, dstHeight uint) image.Image
- func (img *ImageAttr) ResizeNN(dstWidth, dstHeight int) *ImageAttr
- type TJPixelFormat
- type TJSubSample
Examples ¶
Constants ¶
View Source
const ( // ColorSpaceUnknown 未知 ColorSpaceUnknown = C.JCS_UNKNOWN // ColorSpaceGrayScale 灰色 ColorSpaceGrayScale = C.JCS_GRAYSCALE // ColorSpaceRGB RGB ColorSpaceRGB = C.JCS_RGB // ColorSpaceYCbCr YCbCr ColorSpaceYCbCr = C.JCS_YCbCr // ColorSpaceCMYK CMYK ColorSpaceCMYK = C.JCS_CMYK // ColorSpaceYCCK YCCK ColorSpaceYCCK = C.JCS_YCCK // ColorSpaceExtRGB ExtRGB ColorSpaceExtRGB = C.JCS_EXT_RGB // ColorSpaceExtRGBX ExtRGBX ColorSpaceExtRGBX = C.JCS_EXT_RGBX // ColorSpaceExtBGR ExtBGR ColorSpaceExtBGR = C.JCS_EXT_BGR // ColorSpaceExtBGRX ExtBGRX ColorSpaceExtBGRX = C.JCS_EXT_BGRX // ColorSpaceExtXBGR ExtXBGR ColorSpaceExtXBGR = C.JCS_EXT_XBGR // ColorSpaceExtXRGB = ExtXRGB ColorSpaceExtXRGB = C.JCS_EXT_XRGB // ColorSpaceExtRGBA ExtRGBA ColorSpaceExtRGBA = C.JCS_EXT_RGBA // ColorSpaceExtBGRA ExtBGRA ColorSpaceExtBGRA = C.JCS_EXT_BGRA // ColorSpaceExtABGR ExtABGR ColorSpaceExtABGR = C.JCS_EXT_ABGR // ColorSpaceExtARGB ARGB ColorSpaceExtARGB = C.JCS_EXT_ARGB // ColorSpaceExtRGB565 RGB565 ColorSpaceExtRGB565 = C.JCS_RGB565 )
View Source
const ( // DctMethodIntSlow 使用int,较慢(精确)的DCT DctMethodIntSlow = C.JDCT_ISLOW // DctMethodIntFast 使用int且较快(不太精确)的DCT DctMethodIntFast = C.JDCT_IFAST // DctMethodFloat 使用浮点数的DCT DctMethodFloat = C.JDCT_FLOAT )
View Source
const ( // TjFlagFastDCT 使用更快速的DCT/IDCT算法 TjFlagFastDCT = C.TJFLAG_FASTDCT // TjFlagAccurateDCT 使用更准确的DCT/IDCT算法 TjFlagAccurateDCT = C.TJFLAG_ACCURATEDCT // TjFlagProgressive 使用渐进式编码 TjFlagProgressive = C.TJFLAG_PROGRESSIVE )
Variables ¶
View Source
var ( // ErrEmptyImage 传入图片的空的 ErrEmptyImage = errors.New("empty image") // ErrEmptyDecode 解码结果是空的 ErrEmptyDecode = errors.New("decode image empty") // ErrOptionsUnsupported 当前的选项并不支持 ErrOptionsUnsupported = errors.New("options now unsupported") )
View Source
var ( // ErrImgEmpty 图片为空 ErrImgEmpty = errors.New("image is empty") // ErrImgSizeInvalid 图片尺寸不合法 ErrImgSizeInvalid = errors.New("image size is invalid") // ErrQualityOption 图片质量不合法 ErrQualityOption = errors.New("quality option invalid") )
View Source
var ( // ErrWrongDstSize 输入的目标尺寸又唔 ErrWrongDstSize = errors.New("error input dst image width or height") )
Functions ¶
Types ¶
type DecodeOptions ¶
type DecodeOptions struct { // CropRect 图片剪裁区域,默认不剪裁 CropRect *image.Rectangle // DctMethod 解码的时候使用的方法。 // 现在的计算机上有AVX2,JDCT_IFAST和JDCT_ISLOW有相似的性能。如果JPEG图像使用85质量一下的等级压缩的,那么这两种算法 // 应该没有差别。如果高于85,实践中如quality=97,JDCT_IFAST通常会比JDCT_ISLOW的PSNR低大约4-6dB。因此一般不是用 // JDCT_IFAST。对于JDCT_FLOAT并不一定质量就好,因为每个机器的四舍五入情况不一致。 DctMethod DctMethod // TwoPassQuantize 默认是true。 TwoPassQuantize bool // DitherMode 抖动方法,默认是DitherFs。 DitherMode DitherMode // DesiredNumberOfColors 颜色表使用的颜色数量,默认是256。 DesiredNumberOfColors int // DoFancyUpSampling 升采样是否使用精确的,默认是true。 DoFancyUpSampling bool // ScaleNum 按比例缩放图片,在MCU升降采样的时候就能生效,一般为1 ScaleNum uint // ScaleDenom 缩放比例的分母,为了保证图片效果,一般取值为 1/2, 1/4, 1/8... ScaleDenom uint // ExpectWidth 预期宽度,根据图片宽高使用ScaleNum和ScaleDenom参数调整缩放比例。如果设置了会覆盖ScaleNum和ScaleDenom的值。这里缩放的 // 意义在于能在解码阶段低成本的缩放图片,尽量节省 CPU 和内存,且对实际使用效果影响很小。 // // WARNING: 这里只是期望值,并不是实际值,内部会尽量等比缩放到不低于期望值的最合理值,它始终只会以 1/2,1/4,1/8 这样的比例缩小图片。如输入 // 尺寸为 600*800,期望值为 100*200,则实际结果为 150*200;若期望值为 250*300, 则实际结果为 300*400。 ExpectWidth uint // ExpectHeight 预期高度,根据图片宽高使用ScaleNum和ScaleDenom参数调整缩放比例 ExpectHeight uint }
DecodeOptions 解码图片时的选项
type DitherMode ¶
type DitherMode C.J_DITHER_MODE
DitherMode 颜色抖动方法
const ( // DitherNone 无,快,低质量。 DitherNone DitherMode = C.JDITHER_NONE // DitherOrdered 有序抖动,中等速度,中等质量。 DitherOrdered DitherMode = C.JDITHER_ORDERED // DitherFs Floyd-Steinberg算法的抖动,慢,高质量。 DitherFs DitherMode = C.JDITHER_FS )
type EncodeOptions ¶
type EncodeOptions struct { // Quality 图片压缩质量 Quality int // FastDct 快速的DCT FastDct bool // 精确的DCT AccurateDCT bool // SubSample 采样率 SubSample TJSubSample // Progressive 是否使用渐进式编码 Progressive bool }
EncodeOptions 图片编码的选项
type ImageAttr ¶
type ImageAttr struct { Img []byte ImageWidth, ImageHeight int // 输出的图片宽高,若没有剪裁,和Origin的宽高一样 OriginWidth, OriginHeight int // 原始图片宽高 ColorSpace ColorSpace // 色彩空间。目前只有gray和YCbCr。 ComponentsNum int // 颜色分量数,如YCbCr就是3。 }
ImageAttr 图像属性。保存图片原始宽高,目前宽高,颜色空间等基本属性。除此之外,实现了image.Image接口,能够直接使用众多第三方包二次处理。
func Decode ¶
func Decode(img []byte, options *DecodeOptions) (*ImageAttr, error)
Decode 解码JPEG图片
Example ¶
package main import ( "fmt" "io/ioutil" "log" "github.com/picone/gojpegturbo" ) func main() { buf, err := ioutil.ReadFile("./testdata/test.jpg") if err != nil { log.Fatalln(err) } options := gojpegturbo.NewDecodeOptions() options.DctMethod = gojpegturbo.DctMethodIntFast options.DitherMode = gojpegturbo.DitherOrdered options.TwoPassQuantize = false options.DoFancyUpSampling = false options.DesiredNumberOfColors = 216 img, err := gojpegturbo.Decode(buf, options) // options can be nil and all options set to default. if err != nil { log.Fatalln(err) } fmt.Printf("width=%d,height=%d\n", img.Bounds().Max.X, img.Bounds().Max.Y) }
Output: width=600,height=800
func DecodeReader ¶
func DecodeReader(r io.Reader, options *DecodeOptions) (*ImageAttr, error)
DecodeReader 解码reader过来的图片
func ResizeArea ¶
ResizeArea 参考opencv的INTER_AREA算法,目前只能用于图片缩小,放大场景下效果不佳。
Example ¶
package main import ( "fmt" "log" "os" "github.com/picone/gojpegturbo" ) func main() { fp, err := os.Open("./testdata/test.jpg") if err != nil { log.Fatalln(err) } srcImg, err := gojpegturbo.DecodeReader(fp, nil) // here you can cut your image with options. if err != nil { log.Fatalln(err) } // if you use Area algo, it SHOULD NOT pass width or height max than origin. dstImg, err := srcImg.ResizeArea(200, 400) if err != nil { log.Fatalln(err) } encOptions := gojpegturbo.NewEncodeOptions() encOptions.Quality = 60 buf, err := gojpegturbo.Encode(dstImg, encOptions) if err != nil { log.Fatalln(err) } fmt.Printf("%v", len(buf) > 0) // here you can write `buf` to file }
Output: true
func (*ImageAttr) ResizeArea ¶
ResizeArea 用 INTER_AREA 方法缩小图片,这个方法不能用于图片放大。
func (*ImageAttr) ResizeBilinear ¶
ResizeBilinear 使用 Bilinear (双线插值)算法,速度次之,但是锯齿会少很多。
type TJPixelFormat ¶
type TJPixelFormat int
TJPixelFormat 像素存储的格式。
const ( // TJPixelFormatRGB RGB TJPixelFormatRGB TJPixelFormat = C.TJPF_RGB // TJPixelFormatBGR BGR TJPixelFormatBGR TJPixelFormat = C.TJPF_BGR // TJPixelFormatRGBX RGBX TJPixelFormatRGBX TJPixelFormat = C.TJPF_RGBX // TJPixelFormatBGRX BGRX TJPixelFormatBGRX TJPixelFormat = C.TJPF_BGRX // TJPixelFormatXBGR XBGR TJPixelFormatXBGR TJPixelFormat = C.TJPF_XBGR // TJPixelFormatXRGB XRGB TJPixelFormatXRGB TJPixelFormat = C.TJPF_XRGB // TJPixelFormatGray gray TJPixelFormatGray TJPixelFormat = C.TJPF_GRAY // TJPixelFormatRGBA RGBA TJPixelFormatRGBA TJPixelFormat = C.TJPF_RGBA // TJPixelFormatBGRA BGRA TJPixelFormatBGRA TJPixelFormat = C.TJPF_BGRA // TJPixelFormatABGR ABGR TJPixelFormatABGR TJPixelFormat = C.TJPF_ABGR // TJPixelFormatARGB ARGB TJPixelFormatARGB TJPixelFormat = C.TJPF_ARGB // TJPixelFormatCMYK CMYK TJPixelFormatCMYK TJPixelFormat = C.TJPF_CMYK // TJPixelFormatUnknown 未知 TJPixelFormatUnknown TJPixelFormat = C.TJPF_UNKNOWN )
type TJSubSample ¶
type TJSubSample int
TJSubSample 二次采样方法,一般是4:2:0采样。
const ( // TjSubSample444 每个颜色分量对应1个像素点。 TjSubSample444 TJSubSample = C.TJSAMP_444 // TjSubSample422 每个颜色分量对应包含2x1个像素区块。 TjSubSample422 TJSubSample = C.TJSAMP_422 // TjSubSample420 每个颜色分量对应包含2x2个像素区块。 TjSubSample420 TJSubSample = C.TJSAMP_420 // TjSubSampleGray 只有明暗分量没有颜色分量 TjSubSampleGray TJSubSample = C.TJSAMP_GRAY // TjSubSample440 每个颜色分量对应包含1x2个像素区块。 // note: 4:4:0采样在turbojpeg中没有完全加速。 TjSubSample440 TJSubSample = C.TJSAMP_440 // TjSubSample411 每个颜色分量对应包含4x1个像素区块,和420大小一样的,但是更好地表现横向特征。 TjSubSample411 TJSubSample = C.TJSAMP_411 )
Click to show internal directories.
Click to hide internal directories.