gpt4 book ai didi

image - 为什么来自 Bild 的 jpeg.Decode(bytes.NewReader(imageBytes)) 和 jpeg.Encode(buf, img, nil) 占用大量 CPU?

转载 作者:数据小太阳 更新时间:2023-10-29 03:34:30 27 4
gpt4 key购买 nike

我正在尝试使用 Bild 构建一个在运行时处理图像的应用程序.但是上述方法正在为图像占用大量 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 包已经为您完成了,在使用 image.Decode() 时.只需确保您事先注册了图像解码器,您可以通过使用空白导入来实现,例如:

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

func imageDecode(imageBytes []byte) (image.Image, error) {
img, _, err := image.Decode(bytes.NewReader(imageBytes))
}

虽然我不确定性能是否会因此显着提高。

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

  • 如果输入是 GIF 图片。
  • 如果输入是 JPEG 图片。

如果图像是 PNG 格式,您只需要真正对其进行解码。请注意,检测 PNG 图像是否不透明的速度很慢,因为它必须检查所有像素(除非较早发现透明像素)。

关于image - 为什么来自 Bild 的 jpeg.Decode(bytes.NewReader(imageBytes)) 和 jpeg.Encode(buf, img, nil) 占用大量 CPU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51302436/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com