package de.darkress.pixelfood; import javax.imageio.ImageIO; import javax.sound.sampled.Port; import java.awt.image.BufferedImage; import java.io.*; import java.net.*; import java.util.ArrayList; class Worker extends Thread { String HOSTNAME; int PORT; Socket socket; String[] pixelArray; public Worker(String HOSTNAME, int PORT, String[] pixelArray) { this.HOSTNAME = HOSTNAME; this.PORT = PORT; try { this.socket = new Socket(HOSTNAME, PORT); } catch (IOException e) { e.printStackTrace(); } this.pixelArray = pixelArray; } @Override public void run() { while(true) { try { for(int i = 0; i < pixelArray.length; i++) { byte[] payload = pixelArray[i].getBytes(); socket.getOutputStream().write(payload); } } catch (IOException e) { try { this.socket = new Socket(HOSTNAME, PORT); } catch (IOException i) { i.printStackTrace(); } System.out.println(this.getId() + "just dies. Trying again..."); } } } } class Main { private static BufferedImage processImage(String imageFile) { BufferedImage image; try { File file = new File(imageFile); image = ImageIO.read(file); return image; } catch (IOException e) { e.printStackTrace(); } return null; } private static ArrayList prepareArray(BufferedImage image, int xOffset, int yOffset) { int width = image.getWidth(); int height = image.getHeight(); ArrayList pixelArray = new ArrayList<>(); // Iterate over each pixel for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { // Get the RGBA value of the pixel int pixel = image.getRGB(x, y); // Extract individual color components int alpha = (pixel >> 24) & 0xFF; String rgbValue = String.format("%06X", (pixel & 0xFFFFFF)); String messageParameters = String.format("PX %s %s %s\n", x+xOffset, y+yOffset, rgbValue); if(alpha != 0) { pixelArray.add(messageParameters); } } } /*String[] payloadArray = new String[pixelArray.size()]; for(int i = 0; i < payloadArray.length; i++) { payloadArray[i] = pixelArray.get(i); } return payloadArray;*/ return pixelArray; } public static String[] prepareThreadArray(ArrayList fullArray, int threadNumber, int threadCount) { int count = 0; int arrayStart = (threadNumber*fullArray.size())/threadCount; int arrayEnd = ((threadNumber+1)*fullArray.size())/threadCount; String[] threadArray = new String[arrayEnd-arrayStart]; for(int i = arrayStart; i < arrayEnd; i++) { threadArray[count] = fullArray.get(i); count++; } return threadArray; } //Syntax blabla.jar x y Hostname Port Image.png public static void main(String[] args) { final int PORT = Integer.parseInt(args[3]);; final String HOSTNAME = args[2]; final int xOffset = Integer.parseInt(args[0]); final int yOffset = Integer.parseInt(args[1]); int threadCount = Integer.parseInt(args[4]); final String imageName = args[5]; // Read the PNG file BufferedImage image = processImage(imageName); ArrayList fullArray = prepareArray(image, xOffset, yOffset); ArrayList workerList = new ArrayList<>(); for(int i = 0; i < threadCount; i++) { String[] threadArray = prepareThreadArray(fullArray, i, threadCount); workerList.add(new Worker(HOSTNAME, PORT, threadArray)); } for(int i = 0; i < threadCount; i++) { workerList.get(i).start(); } } }