Files
PixelFloodClient/de/darkress/pixelfood/Main.java
2023-06-11 03:44:10 +02:00

130 lines
4.0 KiB
Java

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<String> prepareArray(BufferedImage image, int xOffset, int yOffset) {
int width = image.getWidth();
int height = image.getHeight();
ArrayList<String> 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<String> fullArray, int threadNumber, int threadCount)
{
String[] threadArray = new String[fullArray.size()/threadCount];
int count = 0;
for(int i = (threadNumber*fullArray.size())/threadCount; i < ((threadNumber+1)*fullArray.size())/threadCount; 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<String> fullArray = prepareArray(image, xOffset, yOffset);
ArrayList<Worker> 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();
}
}
}