2013-04-18 14 views
5

Goで画像処理を行っていて、画像のSubImageを取得しようとしています。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)と表示されます。

どのような考えですか?

+2

もっと慣用的なGoコードを書いたくない場合があります。 'image_file'の代わりに' imageFile'のような名前を付ける変数は、あなたのコードを見直すのに役立ちます。 – Volker

答えて

5

image.ImageにはメソッドSubImageがありません。タイプアサーションを使用して適切なimage.*タイプを取得する必要があります。ここ

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

は、代替的なアプローチである - my_imageSubImage方法を持っていることを主張するタイプのアサーションを使用します。これはSubImageメソッドを持つimageタイプ(すべてがクイックスキャンでUniformを除く)で機能します。これにより、指定されていないタイプの別のImageインターフェイスが返されます。あなたは、あなたがSubImageインターフェイスを持つ新しいタイプを作成して、それを使用することになり、この多くのことをやってみたかった場合

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

} 

type assertions

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

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

通常の注意事項が適用されます - あなたがパニックをしたくない場合は,okフォームを使用します。

関連する問題