Golang中如何将[]byte转换为image

Golang中如何将[]byte转换为image 我正在从谷歌云存储桶下载一张图片,下载后我得到了一个字节切片([]byte),并尝试将其解码为图片以便进行后续处理。但我一直得到 nil 值。请帮忙看看,以下是我的代码:

//read object from bucket
rc, err := bkt.Object("1090873.jpeg").NewReader(ctx)

if err != nil {
	fmt.Println("Error getting image from bucket")
}

data, err := ioutil.ReadAll(rc)
if err != nil {
	fmt.Pringln("Error reading rc")
}

// decode []byte in to workable image

img, _, _ := image.Decode(bytes.NewReader(data))

if img == nil {
	fmt.Println("Your don't have an image body")
}

我已经尝试了这个函数的不同变体,但不确定我是否正确使用了它,显然没有,因为它不工作。 img, _, _ := image.Decode(bytes.NewReader(data)) 我确定我有数据,它不是 nil,因为我可以将字节切片数组的值打印到控制台,只是不知道如何将其转换为图片。我的下一行代码将是:

// Resize the cropped image to width = 500px preserving the aspect ratio.
img = imaging.Resize(src, 500, 0, imaging.Lanczos)

但要执行到这里,我需要一个图片对象。


更多关于Golang中如何将[]byte转换为image的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

我正在使用 libvips 来处理图像。试试 https://github.com/davidbyttow/govips

更多关于Golang中如何将[]byte转换为image的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


以下是我最终采用的方案,欢迎大家改进。谢谢。

func serveFrames(imgByte []byte) image.Image {
	img, _, err := image.Decode(bytes.NewReader(imgByte))
	if err != nil {
		log.Fatalln(err)
	}

	out, _ := os.Create("./img.jpeg")
	defer out.Close()

	var opts jpeg.Options
	opts.Quality = 1

	err = jpeg.Encode(out, img, &opts)

	if err != nil {
		log.Println(err)
	}
	return img
}

你的思路是正确的。问题可能出在错误处理或图像格式兼容性上。

你可以试试这个脚本。

func serveFrames(imgByte []byte) image.Image {
    img, _, err := image.Decode(bytes.NewReader(imgByte))
    if err != nil {
        log.Fatalf("Error decoding image: %v", err)
    }

    // Resize the image
    resizedImg := imaging.Resize(img, 500, 0, imaging.Lanczos)

    // Saving the resized image (optional)
    out, err := os.Create("./resized_img.jpeg")
    if err != nil {
        log.Fatalf("Error creating image file: %v", err)
    }
    defer out.Close()

    var opts jpeg.Options
    opts.Quality = 90 // Adjust quality as needed

    err = jpeg.Encode(out, resizedImg, &opts)
    if err != nil {
        log.Fatalf("Error encoding image: %v", err)
    }

    return resizedImg
}

在Golang中将[]byte转换为image.Image时,需要确保正确使用image.Decode函数并处理错误。你的代码没有正确处理解码错误,这可能导致无法识别图片格式。以下是修正后的代码:

package main

import (
    "bytes"
    "fmt"
    "image"
    _ "image/jpeg" // 注册JPEG解码器
    _ "image/png"  // 注册PNG解码器
    "io/ioutil"
)

func main() {
    // 假设data是从云存储获取的[]byte
    data, err := ioutil.ReadFile("1090873.jpeg")
    if err != nil {
        fmt.Println("Error reading file:", err)
        return
    }

    // 解码图片
    img, format, err := image.Decode(bytes.NewReader(data))
    if err != nil {
        fmt.Println("Error decoding image:", err)
        return
    }

    fmt.Printf("Successfully decoded %s image\n", format)
    fmt.Printf("Image bounds: %v\n", img.Bounds())
}

关键点:

  1. 必须导入相应的图片格式包来注册解码器(使用_导入)
  2. 必须检查image.Decode返回的错误
  3. bytes.NewReader(data)是正确的创建方式

对于你的具体场景,完整示例如下:

// 从存储桶读取对象
rc, err := bkt.Object("1090873.jpeg").NewReader(ctx)
if err != nil {
    fmt.Println("Error getting image from bucket:", err)
    return
}
defer rc.Close()

// 读取数据
data, err := ioutil.ReadAll(rc)
if err != nil {
    fmt.Println("Error reading rc:", err)
    return
}

// 解码图片
img, format, err := image.Decode(bytes.NewReader(data))
if err != nil {
    fmt.Println("Error decoding image:", err)
    return
}

fmt.Printf("Decoded %s image successfully\n", format)

// 现在可以继续处理图片
// img = imaging.Resize(img, 500, 0, imaging.Lanczos)

如果你需要支持更多图片格式,可以添加相应的导入:

import (
    _ "image/gif"
    _ "golang.org/x/image/bmp"
    _ "golang.org/x/image/tiff"
    _ "golang.org/x/image/webp"
)

如果仍然遇到问题,可以检查数据是否完整:

// 验证数据长度
fmt.Printf("Data length: %d bytes\n", len(data))

// 验证前几个字节(文件签名)
if len(data) > 4 {
    fmt.Printf("First 4 bytes: % x\n", data[:4])
}

JPEG文件通常以ff d8 ff开头,PNG文件以89 50 4e 47开头。

回到顶部