回答編集履歴

2

解決方法例

2020/11/23 10:05

投稿

d_tutuz
d_tutuz

スコア730

test CHANGED
@@ -24,4 +24,148 @@
24
24
 
25
25
 
26
26
 
27
+ ---
28
+
29
+
30
+
31
+ 仮にエラーが発生した場合に、そのエラーを標準エラー出力に表示するだけでも原因の手がかりがつかめるでしょう。
32
+
33
+
34
+
35
+ ```go
36
+
37
+ package main
38
+
39
+
40
+
41
+ import (
42
+
43
+ "image"
44
+
45
+ "image/png"
46
+
47
+ "os"
48
+
49
+ )
50
+
51
+
52
+
53
+ func main() {
54
+
55
+ // Original image
56
+
57
+ f, err := os.Open("./cat.jpg")
58
+
59
+ if err != nil {
60
+
61
+ panic(err)
62
+
63
+ }
64
+
65
+ img, _, err := image.Decode(f)
66
+
67
+ if err != nil {
68
+
69
+ panic(err)
70
+
71
+ }
72
+
73
+ defer f.Close()
74
+
75
+
76
+
77
+ // Conveted image
78
+
79
+ out, err := os.Create("./cat.png")
80
+
81
+ if err != nil {
82
+
83
+ panic(err)
84
+
85
+ }
86
+
87
+ defer out.Close()
88
+
89
+ if err := png.Encode(out, img); err != nil {
90
+
91
+ panic(err)
92
+
93
+ }
94
+
95
+ }
96
+
97
+ ```
98
+
99
+
100
+
101
+ 上記を実行すると以下のようになります。
102
+
103
+
104
+
105
+ ```
106
+
107
+ panic: image: unknown format
108
+
109
+
110
+
111
+ goroutine 1 [running]:
112
+
113
+ main.main()
114
+
115
+ main.go:17 +0x22b
116
+
117
+ ```
118
+
119
+
120
+
121
+ ---
122
+
123
+
124
+
125
+ 具体的な解決方法としては
126
+
127
+
128
+
27
- `panic` が出力しているスタックレースからは `Encode` が起因になっいますが、その前の `os.Create` でエラーが発生していないかチェックしましょ
129
+ - 1.インポー `_ "image/jpeg"` を指定しjpeg を扱ことを明示する
130
+
131
+
132
+
133
+ ```go
134
+
135
+ import (
136
+
137
+ "image"
138
+
139
+ _ "image/jpeg"
140
+
141
+ "image/png"
142
+
143
+ "os"
144
+
145
+ )
146
+
147
+ ```
148
+
149
+
150
+
151
+ - 2.`image` パッケージではなく `jpeg` パッケージを用いてデコードする
152
+
153
+
154
+
155
+ ```go
156
+
157
+ img, err := jpeg.Decode(f)
158
+
159
+ if err != nil {
160
+
161
+ panic(err)
162
+
163
+ }
164
+
165
+ defer f.Close()
166
+
167
+ ```
168
+
169
+
170
+
171
+ などが考えられます。

1

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

2020/11/23 10:05

投稿

d_tutuz
d_tutuz

スコア730

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