[解決済み] Goで生成されたアニメーションGIFがウィンドウズで動かない
質問
Windowsで正しく動作しない例がありました。 このプログラムは、Go の標準イメージ パッケージの基本的な使い方を示しています。このパッケージを使用して、ビットマップ イメージのシーケンスを作成し、そのシーケンスを GIF アニメーションとしてエンコードします。
package main
import (
"image"
"image/color"
"image/gif"
"io"
"math"
"math/rand"
"os"
)
import (
"log"
"net/http"
"time"
)
//!+main
var palette = []color.Color{color.White, color.Black}
const (
whiteIndex = 0 // first color in palette
blackIndex = 1 // next color in palette
)
func main() {
//!-main
// The sequence of images is deterministic unless we seed
// the pseudo-random number generator using the current time.
// Thanks to Randall McPherson for pointing out the omission.
rand.Seed(time.Now().UTC().UnixNano())
if len(os.Args) > 1 && os.Args[1] == "web" {
//!+http
handler := func(w http.ResponseWriter, r *http.Request) {
lissajous(w)
}
http.HandleFunc("/", handler)
//!-http
log.Fatal(http.ListenAndServe("localhost:8000", nil))
return
}
//!+main
lissajous(os.Stdout)
}
func lissajous(out io.Writer) {
const (
cycles = 5 // number of complete x oscillator revolutions
res = 0.001 // angular resolution
size = 100 // image canvas covers [-size..+size]
nframes = 64 // number of animation frames
delay = 8 // delay between frames in 10ms units
)
freq := rand.Float64() * 3.0 // relative frequency of y oscillator
anim := gif.GIF{LoopCount: nframes}
phase := 0.0 // phase difference
for i := 0; i < nframes; i++ {
rect := image.Rect(0, 0, 2*size+1, 2*size+1)
img := image.NewPaletted(rect, palette)
for t := 0.0; t < cycles*2*math.Pi; t += res {
x := math.Sin(t)
y := math.Sin(t*freq + phase)
img.SetColorIndex(size+int(x*size+0.5), size+int(y*size+0.5),
blackIndex)
}
phase += 0.1
anim.Delay = append(anim.Delay, delay)
anim.Image = append(anim.Image, img)
}
gif.EncodeAll(out, &anim) // NOTE: ignoring encoding errors
}
cmdでは正常に動作するのですが、Windows Power Shellで実行すると、このようになります。
.\lissajous.exe >out.gif
out.gifが開けないのですが、なぜでしょうか?
どうすればいいですか?
GIFファイル(GIFデータ)は、テキストではなくバイナリ形式です。標準出力に書き込んで、それをファイルにリダイレクトしようとすると、変換に苦しむことがあります。例えば、Windows PowerShellは、ほとんどの場合、いくつかの制御文字(例えば
"\n"
を
"\r\n"
と同じにはなりません。
gif.EncodeAll()
は標準出力に書き出す。どうやら
cmd.exe
はそのような変換を行いません。
ファイルに直接書き込むことをお勧めします。
os.File
を出力とする)、あるいは、インメモリバッファで
ioutil.WriteFile()
.
ファイルへの直接書き込みは、こんな感じです。
f, err := os.Create("a.gif")
if err != nil {
panic(err)
}
defer f.Close()
lissajous(f)
インメモリーソリューションはこんな感じです。
buf := &bytes.Buffer{}
lissajous(buf)
if err := ioutil.WriteFile("a.gif", buf.Bytes(), 0666); err != nil {
panic(err)
}
関連する問題を参照してください。 image/gif: EncodeAll の結果が GNOME の Eye で表示されない。
また、一部のアプリで結果が読めない可能性があります(上記の問題参照)。これは、unixで以下のコマンドを使用して出力画像を変換することで解決できます。
convert original.gif -coalesce unoptimized.gif
出典 eog では開けず、Firefox と ImageMagick では開けるアニメーション GIF 画像を修正しました。
関連
-
[解決済み] Matlabでどのようにimwarp転送ポイント?
-
[解決済み] サブフィギュアの垂直アライメント LATEX
-
[解決済み] アニメーションGIFの代替品にはどんなものがありますか?[クローズド]
-
[解決済み] Windowsでコマンドラインから空のファイルを作成するには?
-
[解決済み] イメージからDockerfileを生成するには?
-
[解決済み】linuxでコマンドラインから一連の画像をPDFに変換するにはどうすればいいですか?[クローズド]
-
[解決済み] [Solved] How do you stretch an image to fill a <div> while keeping the image's aspect-ratio?
-
[解決済み】ImageMagickを使って画像を "Diff "する。
-
[解決済み] HTML5 アップロード前に画像をプリリサイズする
-
[解決済み】FFmpegで画像から動画を作成する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Matlabでどのようにimwarp転送ポイント?
-
[解決済み] サブフィギュアの垂直アライメント LATEX
-
[解決済み] Matlabでアフィン変換
-
[解決済み] CSSによるフォールバック画像
-
[解決済み] kubernetesでデプロイメント/イメージを削除する方法
-
[解決済み] 平均像減算の仕組みは?
-
[解決済み] Markdownで画像サイズを変更する
-
[解決済み] イメージからDockerfileを生成するには?
-
[解決済み】linuxでコマンドラインから一連の画像をPDFに変換するにはどうすればいいですか?[クローズド]
-
[解決済み】FFmpegで画像から動画を作成する方法は?