2017-02-22 48 views
0

Как преобразовать файл размером до 320 тыс. Байт в изображение с 1, 2 или 3 байтами (любой будет) цвета?Преобразование произвольных байтов в любой формат изображения без потерь

Я хочу показать, как маленькое приложение моей эпохи 1980-х годов представляет 100% данных 320 тыс. Изображений в виде растрового изображения, напечатанного на моей проектной карте.

I знаю данные не будут похожи ни на что, кроме шума, но это нормально. Я просто хочу сказать: «Вот именно - эти пиксели однозначно представляют каждый байт в этом приложении!»

Было бы здорово, если бы там был «2D штрих-кодов» приложение, которое делает это, но после часа поисков я не мог найти тот, который имел способность и была реализована (много работ.)

+0

Can изображение Магию принуждают к этому? –

ответ

2

Можно ли заставить 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 

gray_output.png

Цвет подход. Трехканальное 8-битное изображение.

cat myProgram.blob | \ 
    convert -size 500x213 -depth 8 -format RGB RGB:- rgb_output.png 

rgb_output.png

Вам нужно сделать немного математики, чтобы определить размеры изображения, но это легко.

total_bytes = [number of channels] * width * height 

Я знаю, что эти данные не будут выглядеть как угодно, но шум, но это нормально. Я просто хочу сказать:

«Все, эти пиксели однозначно представляют каждый байт в этом приложении!»

Год назад у меня была та же проблема. Мне нужна быстрая визуальная контрольная сумма, чтобы «с первого взгляда» определить, отличаются ли данные-капли.

И вот, я создал vizsum. Ни в коем случае не без потерь, или математически безопасно, но красивее на глазах.

cat myProgram.blob | vizsum -sha1 -bilinear visual_checksum.png 

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 

output.png

+0

Удивительный! Благодарю. –