为什么来自《图片报》的jpeg.Decode(bytes.NewReader(imageBytes))和jpeg.Encode(buf、img、nil)会占用大量CPU?

为什么来自《图片报》的jpeg.Decode(bytes.NewReader(imageBytes))和jpeg.Encode(buf、img、nil)会占用大量CPU?,image,go,Image,Go,我正在尝试构建一个应用程序,该应用程序在运行时使用。但是上述方法消耗了大量图像CPU(90%)。这些方法使用高CPU的原因是什么? 是否有其他使用较少CPU的方法或包 func imageDecode(imageBytes []byte) (image.Image, error) { contentType := http.DetectContentType(imageBytes) var err error var img image.Image if cont

我正在尝试构建一个应用程序,该应用程序在运行时使用。但是上述方法消耗了大量图像CPU(90%)。这些方法使用高CPU的原因是什么? 是否有其他使用较少CPU的方法或包

func imageDecode(imageBytes []byte) (image.Image, error) {
    contentType := http.DetectContentType(imageBytes)
    var err error
    var img image.Image
    if contentType == constants.PngContentType {
        img, err = png.Decode(bytes.NewReader(imageBytes))
    } else if contentType == constants.JpegContentType {
        img, err = jpeg.Decode(bytes.NewReader(imageBytes))
    } else if contentType == constants.GifContentType {
        img, err = gif.Decode(bytes.NewReader(imageBytes))
    } else {
        img, err = nil, fmt.Errorf("decode error invalid content-type for filename: ")
    }
    if err != nil {
        return img, err
    }
    return img, nil
}

func imageEncode(imageBytes []byte, img image.Image) ([]byte, error) {
    contentType := http.DetectContentType(imageBytes)
    if contentType == constants.PngContentType && isOpaque(img) {
        contentType = constants.JpegContentType
    }
    buf := new(bytes.Buffer)
    var err error
    var transformedImageBytes []byte
    if contentType == constants.PngContentType {
        pngEnc := png.Encoder{CompressionLevel: png.BestCompression}
        err = pngEnc.Encode(buf, img)
    } else if contentType == constants.JpegContentType {
        err = jpeg.Encode(buf, img, nil)
    } else if contentType == constants.GifContentType {
        err = gif.Encode(buf, img, nil)
    } else {
        err = fmt.Errorf("encode error invalid content-type")
    }
    if err != nil {
        return transformedImageBytes, err
    }
    transformedImageBytes = buf.Bytes()
    return transformedImageBytes, err
}

您不需要手动检测图像类型并使用不同的解码调用,在使用时,
image
包已经为您完成了这项工作。只需确保您事先注册了图像解码器,这可以通过使用空白导入来实现,例如:

import (
    _ "image/gif"
    _ "image/jpeg"
    _ "image/png"
)

func imageDecode(imageBytes []byte) (image.Image, error) {
    img, _, err := image.Decode(bytes.NewReader(imageBytes))
}
尽管我不确定这样做是否会显著提高性能

您应该做的是使用“智能”转换。我的意思是,在某些情况下,您可以省略对图像的解码和重新编码,您可以按原样将输入发送到输出(例如,使用):

  • 如果输入是GIF图像
  • 如果输入是JPEG图像

你只需要真正解码的图像,如果它是PNG格式。请注意,检测PNG图像是否不透明很慢,因为它必须检查所有像素(除非之前找到透明像素)。

我们不知道如何使用它们。代码示例会很有帮助。目标为a。示例代码写在上面!我使用8个CPU,以50转/秒的速度进行测试!I我们在什么情况下使用io.copy()?你能举个例子吗?@Sainath我假设这个图像转换是从HTTP处理程序调用的。如果是这样,您可以使用
io.Copy()
将输入图像(包装在
bytes.Buffer
中)复制到
http.ResponseWriter
。如果不需要转换,只需将输入
imageBytes
作为输出字节片返回即可。