質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Echo(フレームワーク)

Echoは、Go言語で作られたフレームワーク。非常に軽量で、小~中規模のアプリ構成を想定した仕様になっています。公式ドキュメントが用意されており、初心者でも始めやすい点が特徴です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Q&A

1回答

921閲覧

<Go> png.Decodeがうまくいきません

lul

総合スコア1

Echo(フレームワーク)

Echoは、Go言語で作られたフレームワーク。非常に軽量で、小~中規模のアプリ構成を想定した仕様になっています。公式ドキュメントが用意されており、初心者でも始めやすい点が特徴です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

0グッド

0クリップ

投稿2022/07/09 06:21

Go

1package main 2 3import ( 4 "fmt" 5 "image/png" 6 "io/ioutil" 7 "net/http" 8 "os" 9) 10 11func main() { 12 j, err := http.Get("https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-viii/icons/1.png") 13 if err != nil { 14 panic(err) 15 } 16 img, _ = ioutil.ReadAll(j.Body) 17 file, err := os.Create("sample.png") 18 if err != nil { 19 panic(err) 20 } 21 defer file.Close() 22 file.Write(img) 23 24 raw, err := os.Open("./sample.png") 25 if err != nil { 26 panic(err) 27 } 28 defer raw.Close() 29 30 wantReturn, err := png.Decode(raw) 31 if err != nil { 32 panic(err) 33 } 34 fmt.Println(wantReturn) 35} 36

他のサイトからpngファイルを持ってきて、それを表示させるものを作っています。

1...http.Getで、他のサイトの画像を持ってきて、
2...1で持ってきたものをos.CreateとWriteでsample.pngに移して、
3...2のファイルをos.Openでいじれるようにし、
4...png.Decodeで画像を表示できるようにしようと考えています。

しかしgo runするときに、下のエラーが表示されてサーバーが立ち上がりません。
#image
/opt/homebrew/Cellar/go/1.18.1/libexec/src/image/image.go:49:7: invalid receiver type Image (pointer or interface type)

エラーで表示されたところにいくと、以下のように埋め込みエラー?と出ていました。
// Error implements error
func (Image) Error() string {
panic("unimplemented")
}

png.Decodeをコメントアウトすると正しくサーバーが動くことから、4番がうまくいっていないのではないかと考えています。

また、参考にしたサイトの二つのプログラムを実行してみると、やはり上のエラーが表示されてサーバーが立ち上がりません。
https://qiita.com/sys_cat/items/15322618884b1a6d0871#%E7%94%BB%E5%83%8F%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E3%83%AA%E3%82%B5%E3%82%A4%E3%82%BA%E7%94%BB%E5%83%8F%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%81%8C%E5%86%97%E9%95%B7%E3%81%A7%E3%81%99

https://blog.gainings.dev/posts/image-package/#go%E3%81%A7%E7%94%BB%E5%83%8F%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%9F%E3%81%8B%E3%81%A3%E3%81%9F

どのようにコードを変えたらうまく画像が表示されるか知りたいです。
ご回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

imgへの代入のところでコンパイルエラーになるので示されたコードは試すことが出来ないです。
例示のエラーが再現されません。

また、保存されるsample.pngが開いてみれることを確認しましょう。

追記:

以下を
img, _ = ioutil.ReadAll(j.Body) 

以下のように修正すると、
img, _ := ioutil.ReadAll(j.Body)

https://go.dev/play/p/d8wqKkF3ZZY

go

1package main 2 3import ( 4 "fmt" 5 "image/png" 6 "io/ioutil" 7 "net/http" 8 "os" 9) 10 11func main() { 12 j, err := http.Get("https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-viii/icons/1.png") 13 if err != nil { 14 panic(err) 15 } 16 img, _ := ioutil.ReadAll(j.Body) 17 file, err := os.Create("sample.png") 18 if err != nil { 19 panic(err) 20 } 21 defer file.Close() 22 file.Write(img) 23 24 raw, err := os.Open("./sample.png") 25 if err != nil { 26 panic(err) 27 } 28 defer raw.Close() 29 30 wantReturn, err := png.Decode(raw) 31 if err != nil { 32 panic(err) 33 } 34 fmt.Println(wantReturn) 35}

以上のコードだけを実行してみたところ(ローカルに保存してください)
以下の表示がでました。

&{[0 ... 0] 272 (0,0)-(68,56)}

さらに追記

docker環境をお持ちであれば、上記のサンプルコードを「sample.go」という名前で空のフォルダに作成、そのフォルダにて以下のコマンドでビルドしてみましょう。
これでコンパイルエラーが出ない場合、お使いの環境が壊れている可能性が高いです。

コマンドプロンプト for Windows

docker run --rm -v %cd%:/app -w /app golang go build sample.go

ターミナル for macOS

docker run --rm -v $PWD:/app -w /app golang go build sample.go

投稿2022/07/09 11:31

編集2022/07/11 00:53
nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lul

2022/07/09 12:12

ご回答ありがとうございます! imgのコンパイルエラーはvscodeでは確認できませんでした。どのようなエラーが出たのか教えていただけないでしょうか? sample.pngですが、ターミナル上でopen sample.pngで画像が表示されたので開けると思います。
nobonobo

2022/07/09 22:22

実際のコード片が動作することを追記しました。
lul

2022/07/10 02:38

私のところではコードを修正しても、やはり最初のエラーが発生してしまいました、、 コード片とは具体的に全体のコードのどこか教えていただけないでしょうか?
nobonobo

2022/07/10 04:22 編集

私の提示したコードそのものをなにもないフォルダを作ってその下に「sample.go」などの名前でローカルに保存して「go run sample.go」試してみてください。それでもコンパイルエラーになる場合は環境やプロジェクトの起こし方に問題があるかもしれません。 エラーメッセージは抜粋せず全体を教えてください。 また、環境に問題がある場合、解決のヒントがgo envにて表示される内容にあるかもしれません。
lul

2022/07/10 05:05

try git:(master) ✗ go run sample.go # image /opt/homebrew/Cellar/go/1.18.1/libexec/src/image/image.go:49:7: invalid receiver type Image (pointer or interface type) うまくいきませんでした。 2行目のimageからがエラーメッセージの内容全部になっています。
nobonobo

2022/07/10 13:42

go envで表示される内容を示してもらえれば、何かしら原因が掴めるかもしれません。
lul

2022/07/15 08:21

pokemonApi2 git:(imageOfPokemon2) go env GO111MODULE="" GOARCH="arm64" GOBIN="" GOCACHE="/Users/username/Library/Caches/go-build" GOENV="/Users/username/Library/Application Support/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="arm64" GOHOSTOS="darwin" GOINSECURE="" GOMODCACHE="/Users/username/go/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="darwin" GOPATH="/Users/username/go" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/opt/homebrew/Cellar/go/1.18.1/libexec" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/opt/homebrew/Cellar/go/1.18.1/libexec/pkg/tool/darwin_arm64" GOVCS="" GOVERSION="go1.18.1" GCCGO="gccgo" AR="ar" CC="clang" CXX="clang++" CGO_ENABLED="1" GOMOD="/Users/username/go.mod" GOWORK="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/t6/j3s5zfnn6vq7nrtyrjx71lk00000gn/T/go-build2265238977=/tmp/go-build -gno-record-gcc-switches -fno-common" 返信遅れて申し訳ありません。go envの結果をそのまま貼り付けたものです。
nobonobo

2022/07/15 11:25

/Users/username/go.mod を削除してみてどうなるか試してみてください!
lul

2022/07/16 08:42

pokemonApi2 git:(imageOfPokemon2) go run . go: cannot find main module, but found .git/config in /Users/hatanoriku/go/src/pokemonApi2 to create a module there, run: go mod init このようなエラーが出ました! また、go.modをルートディレクトリ(main.goと同じ階層)に入れ直して実行したところ、やはり最初のエラー pokemonApi2 git:(imageOfPokemon2) ✗ go run . # image /opt/homebrew/Cellar/go/1.18.1/libexec/src/image/image.go:49:7: invalid receiver type Image (pointer or interface type) が出ました。
nobonobo

2022/07/16 15:11

1番目のエラー解消方法は以下の通り。 cd /Users/hatanoriku/go/src/pokemonApi2 go mod init pokemonApi2 go mod tidy 本題のエラーはgo versionで表示されるものがgo1.18.1じゃないような気もする(エラーはgo/1.18.1を指している)。 もしかすると、goenvなどのマルチバージョン系のツール使ってたりしますか?
lul

2022/07/17 06:41

ありがとうございます!一番目のエラーは解決しました。 本題のエラーに関して、多分使っていないと思います。以下がgoenv、gvmをターミナルで実行したものです。 pokemonApi2 git:(imageOfPokemon2) ✗ goenv root zsh: command not found: goenv ➜ pokemonApi2 git:(imageOfPokemon2) ✗ goenv --version zsh: command not found: goenv ➜ pokemonApi2 git:(imageOfPokemon2) ✗ gvm implode zsh: command not found: gvm
nobonobo

2022/07/17 14:45 編集

当方amd64環境しか持っていなくてここから先の原因追及は難しいかもしれません。 何となく環境の問題のように見えるのですが・・・。 dockerをお持ちの場合は「さらに追記」に示すようにdockerによるビルドをお試しください。 手元のGo環境に左右されずに試せるので、docker経由でエラーが出ないなら、手元の環境のGoをインストールしなおすなどをしてみるとよいかもしれません。
lul

2022/07/18 13:48

承知しました。いろいろヒントを与えていただき、ありがとうございました! どうしてもダメそうだったらGoをインストールし直すことにします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問