init
This commit is contained in:
commit
b0cd98b305
|
@ -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