Skip to content

Instantly share code, notes, and snippets.

@suzusuzu
Last active December 18, 2016 00:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save suzusuzu/0b8a6154528951102c28595821a18945 to your computer and use it in GitHub Desktop.
Save suzusuzu/0b8a6154528951102c28595821a18945 to your computer and use it in GitHub Desktop.
gif
package main
import (
"bytes"
"encoding/binary"
"fmt"
"os"
)
func main() {
if len(os.Args) != 3 {
fmt.Println("need 2 args (ex: gif input output.gif")
os.Exit(-1)
}
input_file_info, err := os.Stat(os.Args[1])
if err != nil {
fmt.Println("input file not found")
os.Exit(-1)
}
var inputFileSize int64 = input_file_info.Size()
inputFile, err := os.Open(os.Args[1])
defer inputFile.Close()
if err != nil {
fmt.Println("input file error")
os.Exit(-1)
}
outputFile, err := os.Create(os.Args[2])
defer outputFile.Close()
if err != nil {
fmt.Println("input file error")
os.Exit(-1)
}
initWrite(outputFile)
fileDataWrite(inputFile, inputFileSize, outputFile)
trailerWrite(outputFile)
}
func initWrite(outputFile *os.File) {
buf := new(bytes.Buffer)
// Signature
binary.Write(buf, binary.LittleEndian, []byte("GIF"))
// Version
binary.Write(buf, binary.LittleEndian, []byte("89a"))
// Width
binary.Write(buf, binary.LittleEndian, uint16(0xFFFF))
// Height
binary.Write(buf, binary.LittleEndian, uint16(0xFFFF))
// Color Datas
binary.Write(buf, binary.LittleEndian, uint8(0))
// Background Color Index
binary.Write(buf, binary.LittleEndian, uint8(0))
// Pixel Aspect Ratio
binary.Write(buf, binary.LittleEndian, uint8(0))
// Image Separator
binary.Write(buf, binary.LittleEndian, uint8(0x2C))
// Image Left Position
binary.Write(buf, binary.LittleEndian, uint16(0))
// Image Top Position
binary.Write(buf, binary.LittleEndian, uint16(0))
// Width
binary.Write(buf, binary.LittleEndian, uint16(0xFFFF))
// Height
binary.Write(buf, binary.LittleEndian, uint16(0xFFFF))
// Color Datas
binary.Write(buf, binary.LittleEndian, uint8(0))
// LZW Minimum Code Size
binary.Write(buf, binary.LittleEndian, uint8(8))
outputFile.Write(buf.Bytes())
}
func fileDataWrite(inputFile *os.File, intputFileSize int64, outputFile *os.File) {
buf := new(bytes.Buffer)
b255 := make([]byte, 255)
for i := int64(0); i < (intputFileSize / 255); i++ {
binary.Write(buf, binary.LittleEndian, uint8(255))
inputFile.Read(b255)
binary.Write(buf, binary.LittleEndian, b255)
if i/int64(1024) == 0 {
outputFile.Write(buf.Bytes())
buf.Reset()
}
}
remain := make([]byte, intputFileSize%255)
binary.Write(buf, binary.LittleEndian, uint8(intputFileSize%255))
inputFile.Read(remain)
binary.Write(buf, binary.LittleEndian, remain)
binary.Write(buf, binary.LittleEndian, uint8(0))
outputFile.Write(buf.Bytes())
}
func trailerWrite(outputFile *os.File) {
outputFile.Write([]byte{0x3B})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment