英文:
Trouble getting a SubImage of an Image in Go
问题
我正在使用Go进行一些图像处理,并尝试获取图像的SubImage。
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)
的错误。
有什么想法吗?
英文:
I'm doing some image processing in Go, and I'm trying to get the SubImage of an Image.
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)
}
When I try to compile that, I get .\img.go:8: picture.SubImage undefined (type image.Image has no field or method SubImage)
.
Any thoughts?
答案1
得分: 18
这里有一种替代方法 - 使用类型断言来断言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
形式。
英文:
Here is an alternative approach - use a type assertion to assert that my_image
has a SubImage
method. This will work for any image type which has the SubImage
method (all of them except Uniform
at a quick scan). This will return another Image
interface of some unspecified type.
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())
}
If you wanted to do this a lot then you would create a new type with the SubImage
interface and use that.
type SubImager interface {
SubImage(r image.Rectangle) image.Image
}
my_sub_image := my_image.(SubImager).SubImage(image.Rect(0, 0, 10, 10))
The usual caveats with type assertions apply - use the ,ok
form if you don't want a panic.
答案2
得分: 8
因为image.Image
没有SubImage
方法。你需要使用类型断言来获取适当的image.*
类型。
rgbImg := img.(image.RGBA)
subImg := rgbImg.SubImage(...)
英文:
Because image.Image
doesn't have a method SubImage
. You need to use a type assertion to get the appropriate image.*
type.
rgbImg := img.(image.RGBA)
subImg := rgbImg.SubImage(...)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论