Cześć! :)
Miałem chwilę wolnego i napisałem prosty program do generowania "sygnatury graficznej" pliku. Złapałem kilka plików exe i dwa z nich były interesujące.
- steam.exe (platforma do gier)
- STS.exe (spring toolkit)
W obu przypadkach znalazłem ukryte loga firm (efekty w załącznikach). Mam pytanie czy to popularna praktyka i jak się robi takie rzeczy :)
Dla ciekawskich kod źródłowy:
package core;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
public class Signer {
public static void main(String[] args) throws IOException {
int size = 256*256 + 112; //65 648
Signer s= new Signer();
String path="C:\\Program Files\\Blender Foundation\\Blender\\blender.exe"; // Ścieżka do pliku
int[][] t = s.getDataFromFile(path);
BufferedImage bi = s.generateSignature(t);
s.saveImage("1.jpg", bi);
}
public void saveImage(String filename, BufferedImage buf) throws IOException {
File f = new File(filename);
ImageIO.write(buf, "jpg", f);
}
public BufferedImage generateSignature(int[][] data) {
BufferedImage retn = new BufferedImage(data.length, data.length, BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
retn.setRGB(i, j, data[i][j]);
}
}
return retn;
}
public int[][] getDataFromFile(String path) throws IOException {
Path p = Paths.get(path);
byte[] data = Files.readAllBytes(p);
int[][] retn = this.byteTo2DInt(data);
return retn;
}
public int[][] byteTo2DInt(byte[] d) {
int dim = this.estimateDimesion(d.length);
int[][] retn = new int[dim][dim];
int x=0,y=0;
List<Byte> tmp = new ArrayList<>();
for (int i = 0; i < d.length; i++) {
if (tmp.size() == 3) {
Color c = new Color(tmp.get(0)&0xff,tmp.get(1)&0xff,tmp.get(2)&0xff);
retn[x][y] = c.getRGB();
tmp.clear();
y++;
if (y >= dim) {
x++;
y = 0;
}
}
tmp.add(d[i]);
}
return retn;
}
public int estimateDimesion(int size) {
int sizeInt = size/4;
int dimCounted = 0;
// x * y >= sizeInt
byte powerLevel = 1;
while (Math.pow(dimCounted,2) < sizeInt) {
dimCounted = (int) Math.pow(2, powerLevel);
powerLevel++;
}
return dimCounted;
}
}