teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

解決方法例

2020/11/23 10:05

投稿

d_tutuz
d_tutuz

スコア730

answer CHANGED
@@ -11,4 +11,76 @@
11
11
  // ...
12
12
  ```
13
13
 
14
+ ---
15
+
16
+ 仮にエラーが発生した場合に、そのエラーを標準エラー出力に表示するだけでも原因の手がかりがつかめるでしょう。
17
+
18
+ ```go
19
+ package main
20
+
21
+ import (
22
+ "image"
23
+ "image/png"
24
+ "os"
25
+ )
26
+
27
+ func main() {
28
+ // Original image
29
+ f, err := os.Open("./cat.jpg")
30
+ if err != nil {
31
+ panic(err)
32
+ }
33
+ img, _, err := image.Decode(f)
34
+ if err != nil {
35
+ panic(err)
36
+ }
37
+ defer f.Close()
38
+
39
+ // Conveted image
40
+ out, err := os.Create("./cat.png")
41
+ if err != nil {
42
+ panic(err)
43
+ }
44
+ defer out.Close()
45
+ if err := png.Encode(out, img); err != nil {
46
+ panic(err)
47
+ }
48
+ }
49
+ ```
50
+
51
+ 上記を実行すると以下のようになります。
52
+
53
+ ```
54
+ panic: image: unknown format
55
+
56
+ goroutine 1 [running]:
57
+ main.main()
58
+ main.go:17 +0x22b
59
+ ```
60
+
61
+ ---
62
+
63
+ 具体的な解決方法としては
64
+
14
- `panic` が出力しているスタックトレスからは `Encode` が起因になっていますが、その前の `os.Create` でエラーが発生していないかチェックしましょ
65
+ - 1.インポトに `_ "image/jpeg"` を指定して jpeg を扱ことを明示する
66
+
67
+ ```go
68
+ import (
69
+ "image"
70
+ _ "image/jpeg"
71
+ "image/png"
72
+ "os"
73
+ )
74
+ ```
75
+
76
+ - 2.`image` パッケージではなく `jpeg` パッケージを用いてデコードする
77
+
78
+ ```go
79
+ img, err := jpeg.Decode(f)
80
+ if err != nil {
81
+ panic(err)
82
+ }
83
+ defer f.Close()
84
+ ```
85
+
86
+ などが考えられます。

1

直接の原因がわかっていないため、解決方法を削除

2020/11/23 10:05

投稿

d_tutuz
d_tutuz

スコア730

answer CHANGED
@@ -11,6 +11,4 @@
11
11
  // ...
12
12
  ```
13
13
 
14
- `panic` が出力しているスタックトレースからは `Encode` が起因になっていますが、その前の `os.Create` でエラーが発生していないかチェックしましょう。
14
+ `panic` が出力しているスタックトレースからは `Encode` が起因になっていますが、その前の `os.Create` でエラーが発生していないかチェックしましょう。
15
-
16
- `os.Open` したファイルのファイルハンドラを保持しているので、おそらく `os.Create` でエラーが発生しているでしょう。解決方法としては `os.Open` したファイルハンドラを `defer` ではなく直接 `f.Close()` を呼びだしてクローズすることです。