commit
b0cd98b305
4 changed files with 174 additions and 0 deletions
@ -0,0 +1,24 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"image/color" |
||||
) |
||||
|
||||
func getColor(c color.Color, width, height int) [][][4]uint32 { |
||||
var pixelmatrix [][][4]uint32 |
||||
|
||||
for x := 0; x < width; x++ { |
||||
var xRow [][4]uint32 |
||||
for y := 0; y < height; y++ { |
||||
var pixel [4]uint32 |
||||
pixel[0], pixel[1], pixel[2], pixel[3] = c.RGBA() |
||||
pixel[0] = pixel[0] >>8 |
||||
pixel[1] = pixel[1] >>8 |
||||
pixel[2] = pixel[2] >>8 |
||||
pixel[3] = pixel[3] >>8 |
||||
xRow = append(xRow, pixel) |
||||
} |
||||
pixelmatrix = append(pixelmatrix, xRow) |
||||
} |
||||
return pixelmatrix |
||||
} |
@ -0,0 +1,43 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"os" |
||||
"image" |
||||
_ "image/jpeg" |
||||
_ "image/gif" |
||||
_ "image/png" |
||||
|
||||
log "github.com/sirupsen/logrus" |
||||
) |
||||
|
||||
func getImage(path string) [][][4]uint32 { |
||||
reader, err := os.Open(path) |
||||
if err != nil { |
||||
log.Fatalf("Could not load image: %s",err) |
||||
} |
||||
defer reader.Close() |
||||
m, _, err := image.Decode(reader) |
||||
if err != nil { |
||||
log.Fatal("could not find image in file", err) |
||||
} |
||||
|
||||
|
||||
bounds := m.Bounds() |
||||
|
||||
var pixelmatrix [][][4]uint32 |
||||
for x := bounds.Min.X; x < bounds.Max.X; x++ { |
||||
var xRow [][4]uint32 |
||||
for y := bounds.Min.Y; y < bounds.Max.Y; y++ { |
||||
var pixel [4]uint32 |
||||
pixel[0], pixel[1], pixel[2], pixel[3] = m.At(x, y).RGBA() |
||||
pixel[0] = pixel[0] >>8 |
||||
pixel[1] = pixel[1] >>8 |
||||
pixel[2] = pixel[2] >>8 |
||||
pixel[3] = pixel[3] >>8 |
||||
xRow = append(xRow, pixel) |
||||
} |
||||
pixelmatrix = append(pixelmatrix, xRow) |
||||
} |
||||
|
||||
return pixelmatrix |
||||
} |
@ -0,0 +1,87 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"net" |
||||
"flag" |
||||
"os" |
||||
"os/signal" |
||||
"syscall" |
||||
"fmt" |
||||
"image/color" |
||||
|
||||
log "github.com/sirupsen/logrus" |
||||
) |
||||
|
||||
var targetAddr string |
||||
var imgPath string |
||||
var goProc int |
||||
|
||||
var startx int |
||||
var starty int |
||||
|
||||
var partTotal int |
||||
var partCount int |
||||
var partBegin int |
||||
|
||||
func main() { |
||||
flag.StringVar(&targetAddr, "addr", "151.217.177.136:1234", "address of target tcp") |
||||
flag.StringVar(&imgPath, "img", "", "path to image") |
||||
flag.IntVar(&goProc, "proc", 1, "count of procs (go routines)") |
||||
|
||||
flag.IntVar(&startx, "start-x", 0, "move at x") |
||||
flag.IntVar(&starty, "start-y", 0, "move at y") |
||||
|
||||
flag.IntVar(&partTotal, "part-total", 1, "total count of parts") |
||||
flag.IntVar(&partCount, "part-count", 1, "showed parts") |
||||
flag.IntVar(&partBegin, "part-begin", 0, "beginning at part x") |
||||
flag.Parse() |
||||
|
||||
log.Infof("starting for %s with %d proc(s) | move by (%d,%d) | %d parts of %d begin at %d", targetAddr, goProc, startx, starty, partCount, partTotal, partBegin) |
||||
|
||||
var pixelmatrix [][][4]uint32 |
||||
|
||||
// get matrix
|
||||
if imgPath != "" { |
||||
pixelmatrix = getImage(imgPath) |
||||
}else{ |
||||
pixelmatrix = getColor(color.RGBA{0xcc, 0xff, 0x33, 0xff}, 1024, 1024) |
||||
} |
||||
|
||||
// transform
|
||||
|
||||
pixelmatrix = getPart(pixelmatrix, partCount, partTotal, partBegin) |
||||
|
||||
// connection(s)
|
||||
conn, err := net.Dial("tcp", targetAddr) |
||||
if err != nil { |
||||
log.Fatalf("not able to create connection: %s", err) |
||||
} |
||||
defer conn.Close() |
||||
|
||||
|
||||
// start painting
|
||||
for s := 0; s < goProc; s++ { |
||||
go paint(conn, pixelmatrix, startx, starty) |
||||
} |
||||
|
||||
|
||||
// Wait for INT/TERM
|
||||
sigs := make(chan os.Signal, 1) |
||||
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) |
||||
sig := <-sigs |
||||
log.Println("received", sig) |
||||
|
||||
} |
||||
|
||||
func paint(conn net.Conn, pixelmatrix [][][4]uint32, xstart, ystart int) { |
||||
for { |
||||
for x, row := range pixelmatrix { |
||||
for y, pixel := range row { |
||||
if pixel[3] != 0 { |
||||
msg := fmt.Sprintf("PX %d %d %02x%02x%02x\n", xstart+x, ystart+y, pixel[0], pixel[1], pixel[2]) |
||||
conn.Write([]byte(msg)) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,20 @@ |
||||
package main |
||||
|
||||
import ( |
||||
log "github.com/sirupsen/logrus" |
||||
) |
||||
|
||||
func getPart(pixelmatrix [][][4]uint32, partCount, partTotal, partBegin int) [][][4]uint32 { |
||||
xLength := len(pixelmatrix) |
||||
if xLength < partTotal { |
||||
log.Fatal("more parts then rows not possible") |
||||
return nil |
||||
} |
||||
partSize := (xLength / partTotal) |
||||
|
||||
// last part should return last rows
|
||||
if partBegin + partCount == partTotal { |
||||
return pixelmatrix[ partBegin * partSize : ] |
||||
} |
||||
return pixelmatrix[ partBegin * partSize : (partBegin + partCount) * partSize] |
||||
} |
Loading…
Reference in new issue