/
image-scanfile.go
110 lines (93 loc) · 1.78 KB
/
image-scanfile.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// scan a file for raw embedded images and dump them out
package main
import (
"bufio"
"bytes"
"flag"
"fmt"
"image"
_ "image/gif"
_ "image/jpeg"
"image/png"
"io/ioutil"
"log"
"os"
"path/filepath"
)
var opt struct {
outdir string
prefix string
}
func main() {
log.SetFlags(0)
log.SetPrefix("image-scanfile: ")
parseflags()
imgs, err := scan(flag.Arg(0), sigtab)
ck(err)
os.MkdirAll(opt.outdir, 0755)
for i, m := range imgs {
name := fmt.Sprintf("%s/%s%d.png", opt.outdir, opt.prefix, i)
name = filepath.Clean(name)
f, err := os.Create(name)
if err != nil {
fmt.Fprintln(os.Stderr, err)
continue
}
w := bufio.NewWriter(f)
png.Encode(w, m)
f.Close()
fmt.Printf("Wrote %s\n", name)
}
if len(imgs) == 0 {
fmt.Printf("No supported image files found\n")
}
}
func usage() {
fmt.Fprintln(os.Stderr, "usage: [options] file")
flag.PrintDefaults()
os.Exit(2)
}
func parseflags() {
flag.StringVar(&opt.outdir, "o", ".", "output directory")
flag.StringVar(&opt.prefix, "p", "", "add prefix to output names")
flag.Usage = usage
flag.Parse()
if flag.NArg() < 1 {
usage()
}
}
func ck(err error) {
if err != nil {
log.Fatal(err)
}
}
func scan(name string, sigs [][]byte) ([]image.Image, error) {
b, err := ioutil.ReadFile(name)
if err != nil {
return nil, err
}
var imgs []image.Image
for _, sig := range sigs {
i := 0
for {
n := bytes.Index(b[i:], sig)
if n < 0 {
break
}
i += n
r := bytes.NewReader(b[i:])
m, typ, err := image.Decode(r)
if err == nil {
fmt.Printf("Found %s image at offset %x\n", typ, i)
imgs = append(imgs, m)
}
i += len(sig)
}
}
return imgs, nil
}
var sigtab = [][]byte{
[]byte("\x89PNG\r\n\x1a\n"), // png
[]byte("\xff\xd8"), // jpeg
[]byte("GIF8"), // gif
}