2013-04-18 20 views
5

Zajmuję się przetwarzaniem obrazów w programie Go i próbuję uzyskać SubImage obrazu.Problemy z uzyskaniem obrazu podrzędnego obrazu w ruchu

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) 
} 

Kiedy próbuję to skompilować, otrzymuję .\img.go:8: picture.SubImage undefined (type image.Image has no field or method SubImage).

Jakieś myśli?

+2

Być może nie powinieneś pisać bardziej idiomatycznego kodu Go, np. nazywanie zmiennych jak 'imageFile' zamiast' image_file', ponieważ pomaga to w przejrzeniu twojego kodu. – Volker

Odpowiedz

5

Ponieważ image.Image nie ma metody SubImage. Aby uzyskać odpowiedni typ image.*, należy użyć asercji typu.

rgbImg := img.(image.RGBA) 
subImg := rgbImg.SubImage(...) 
9

Oto alternatywne podejście - użyć typu twierdzenie twierdzić, że my_image ma metodę SubImage. Będzie to działać dla dowolnego typu image, który ma metodę SubImage (wszystkie z wyjątkiem Uniform przy szybkim skanowaniu). Spowoduje to zwrócenie innego interfejsu Image jakiegoś nieokreślonego typu.

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()) 

} 

Jeśli chciał zrobić to dużo wtedy byłoby stworzenie nowego typu z interfejsem SubImage i używać.

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

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

zwykłe ostrzeżenia o type assertions Zastosuj - użyj formularza ,ok jeśli nie chce paniki.