Можно ли заставить imageMagick делать это?
Абсолютно!
Начнем с создания файла программы размером 320k.
dd if=/dev/urandom of=myProgram.blob bs=1000 count=320
YMMV
Серый подход. Одноканальное 8-битное изображение.
cat myProgram.blob | \
convert -size 500x640 -depth 8 -format GRAY GRAY:- gray_output.png
Цвет подход. Трехканальное 8-битное изображение.
cat myProgram.blob | \
convert -size 500x213 -depth 8 -format RGB RGB:- rgb_output.png
Вам нужно сделать немного математики, чтобы определить размеры изображения, но это легко.
total_bytes = [number of channels] * width * height
Я знаю, что эти данные не будут выглядеть как угодно, но шум, но это нормально. Я просто хочу сказать:
«Все, эти пиксели однозначно представляют каждый байт в этом приложении!»
Год назад у меня была та же проблема. Мне нужна быстрая визуальная контрольная сумма, чтобы «с первого взгляда» определить, отличаются ли данные-капли.
И вот, я создал vizsum. Ни в коем случае не без потерь, или математически безопасно, но красивее на глазах.
cat myProgram.blob | vizsum -sha1 -bilinear visual_checksum.png
Update просто для удовольствия.
Вот быстрая программа C помощью MagickWand API
// program2img.c
#include <stdio.h>
#include <math.h>
#include <wand/MagickWand.h> // Or <MagickWand/MagickWand.h> if using IM 7.x.x
int main(int argc, const char * argv[]) {
FILE
* fd;
const char
* input,
* output;
unsigned char
* buffer;
long
program_size,
program_area,
program_width,
program_width_data,
program_height,
col,
row;
MagickBooleanType ok;
// Collect input/output
if (argc != 3) {
fprintf(stderr, "Usage: %s <input> <output>\n", argv[0]);
return 1;
}
input = argv[1];
output = argv[2];
// Open input for reading
fd = fopen(argv[1], "rb");
if (fd == NULL) {
fprintf(stderr, "Unable to open `%s'\n", argv[1]);
return 1;
}
// Get size of input
fseek(fd, 0L, SEEK_END);
program_size = ftell(fd);
fseek(fd, 0L, SEEK_SET);
// Roughly calculate size of output image.
program_area = program_size/3;
program_width = sqrtl(program_area);
if (program_width < 1) {
fprintf(stderr, "Unable to generate image width\n");
return 1;
}
program_width_data = program_width * 3;
program_height = program_area/program_width + 1;
if (program_height < 1) {
fprintf(stderr, "Unable to generate image width\n");
return 1;
}
// Boot ImageMagick
MagickWandGenesis();
PixelWand * color;
MagickWand * wand;
color = NewPixelWand();
wand = NewMagickWand();
PixelSetColor(color, "BLACK");
MagickNewImage(wand, program_width, program_height, color);
color = DestroyPixelWand(color);
buffer = malloc(program_width_data);
// Iterate over input and build image line-by-line
for (row = 0; row < program_height; ++row) {
col = fread(buffer, 1, program_width_data, fd);
// Add padding (might need to double check this logic)
while (col < program_width_data) {
buffer[col++] = '\0';
}
MagickImportImagePixels(wand,
0, row,
program_width, 1,
"RGB", CharPixel, buffer);
}
fclose(fd);
// Save image output.
ok = MagickWriteImage(wand, output);
if (ok == MagickFalse) {
fprintf(stderr, "Unable to save output `%s'\n", output);
}
wand = DestroyMagickWand(wand);
MagickWandTerminus();
return 0;
}
который может быть собран с
clang `MagickWand-config --cflags --libs` program2img.c -o program2img
И использовали
./program2img mySmallProgram output.png
Can изображение Магию принуждают к этому? –