11

我正在 Go 中进行一些图像处理,并且正在尝试获取图像的子图像。

import (
  "image/jpeg"
  "os"
)
func main(){
  image_file, err := os.Open("somefile.jpeg")
  my_image, err := jpeg.Decode(image_file)
  my_sub_image := my_image.SubImage(Rect(j, i, j+x_width, i+y_width)).(*image.RGBA)
}

当我尝试编译它时,我得到.\img.go:8: picture.SubImage undefined (type image.Image has no field or method SubImage).

有什么想法吗?

4

2 回答 2

16

这是另一种方法 - 使用类型断言来断言my_image具有SubImage方法。这适用于任何具有该方法的图像SubImage类型(除了Uniform快速扫描之外的所有图像类型)。这将返回另一个Image未指定类型的接口。

package main

import (
    "fmt"
    "image"
    "image/jpeg"
    "log"
    "os"
)

func main() {
    image_file, err := os.Open("somefile.jpeg")
    if err != nil {
        log.Fatal(err)
    }
    my_image, err := jpeg.Decode(image_file)
    if err != nil {
        log.Fatal(err)
    }

    my_sub_image := my_image.(interface {
        SubImage(r image.Rectangle) image.Image
    }).SubImage(image.Rect(0, 0, 10, 10))

    fmt.Printf("bounds %v\n", my_sub_image.Bounds())

}

如果您想经常这样做,那么您将使用SubImage接口创建一个新类型并使用它。

type SubImager interface {
    SubImage(r image.Rectangle) image.Image
}

my_sub_image := my_image.(SubImager).SubImage(image.Rect(0, 0, 10, 10))

类型断言的常见警告适用 -,ok如果您不想恐慌,请使用该表单。

于 2013-04-18T21:09:37.843 回答
8

因为image.Image没有方法SubImage。您需要使用类型断言来获取适当的image.*类型。

rgbImg := img.(image.RGBA)
subImg := rgbImg.SubImage(...)
于 2013-04-18T01:27:30.397 回答