2012-12-30 71 views
7

पर कनवर्ट करें मुझे एक बाइनरी फ़ाइल को किसी छवि में बदलने के लिए एक तेज़ तरीका ढूंढना होगा। बाइनरी फ़ाइल में एन एन एन मैट्रिक्स शामिल है और मैं 0 को रंग और 1 को एक अलग रंग से जोड़ना चाहता हूं। मुझे इस ऑपरेशन को 1000 से अधिक बाइनरी फ़ाइलों में करने की आवश्यकता है। यदि संभव हो तो मैं MatLab का उपयोग करने से बचना चाहूंगा, क्या कोई उपकरण/सॉफ्टवेयर (यूनिक्स के लिए) है जो मेरी मदद करेगा?बाइनरी फ़ाइल को छवि

संपादित करें:

This वास्तव में मैं क्या देख रहा था है! पृष्ठ के निचले हिस्से में यह कहता है: "टीआईपी: कई फाइलों को संसाधित करने के लिए, इस यूआरएल को पास करने के लिए एक शेल स्क्रिप्ट का उपयोग करें और अपने वांछित पैरामीटर को wget करने के लिए और फिर आउटपुट को" "फ़ाइल करने के लिए निर्देशित करें, फिर भी मैं यह नहीं कर सकता। मैं के साथ की कोशिश की:

wget --post-data="blocksize=10&width=10&offset=0&markval=-1&autoscale=0" \ 
     --post-file="userfile=/path.../filename" http://www.ryanwestafer.com/stuff/bin2img.php \ 
     > output 

लेकिन सभी मैं अपने स्थानीय फ़ोल्डर में डाउनलोड की मूल पृष्ठ है! आप जनहित याचिका (छवि) पुस्तकालय स्थापित अजगर है, तो

+2

आप कुछ और इसके साथ कुछ समस्या का सामना करना पड़ की कोशिश की? –

+0

एनएक्सएनएक्सएन द्वारा क्या आपका मतलब है कि आपके पास 3 डी घन है? – mmgp

+0

@mmgp हां यह एक 3 डी घन है, यह इस तरह की स्मृति में संग्रहीत है: [face_0] [face_1] ... [face_N-1] मुझे बस 2 डी छवि की आवश्यकता है, लेकिन 3 डी बहुत अच्छा होगा! – user1584773

उत्तर

5

:

import Image 
def colormap(s): 
    s_out = [] 
    for ch in s: # assume always '\x00' or '\x01' 
     if s == '\x00': 
      s_out.append('\x00') # black 
     else: 
      s_out.append('\xFF') # white 
    return ''.join(s_out) 

N= 50 # for instance 
fin = open('myfile.bin','rb') 
data = fin.read(N*N) # read NxN bytes 
data = colormap(data) 

# convert string to grayscale image 

img = Image.fromstring('L', (N,N), data) 
# save to file 
img.save('thisfile.png') 

data = fin.read(N*N) # next NxN bytes 
data = colormap(data) 

img = Image.fromstring('L', (N,N), data) 
img.save('thisfile2.png') 

यह आसानी से पाश और अनुक्रम फ़ाइल नाम के लिए, आदि की जरूरत

1

जीएनयू सप्टक के रूप में संशोधित किया जा सकता एक नि: शुल्क मैटलैब की तरह है कार्यक्रम है कि बहुत से लोगों को पसंद है। मैं आम तौर पर उन्हें VRML3D में बदल जाएंगे और/ParallelGraphics का उपयोग कर Cortona3D उन पर विचार करेंगे, http://www.math.tu-berlin.de/~ehrhardt/matlab_alternatives.html

3

3 डी matrixes के लिए:

इस साइट मुक्त विकल्प की एक पूरी सूची है।

अन्यथा, मैट्रिक्स के सभी को देखने के लिए आपको मैट्रिक्स के किसी प्रकार की प्रक्षेपण या "टुकड़ा" की आवश्यकता है।

यह एक पीएनजी फ़ाइल में 3 डी मैट्रिक्स डंप करने के लिए एक सी कार्यान्वयन है।

gcc -W -Wall -o bin2png bin2png.c -lpng 

कोड के साथ संकलित करें:

#include <stdio.h> 
#include <stdint.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <png.h> 

static png_structp png_ptr; 
static png_infop info_ptr; 

/** 
         |<--- W ---->| 

         +------------+  - 
         | 18 19 20|  | 
        +-------------+ |  | 
        | 9 10 11 | |  | 
       +-------------+ |23|  +--> H 
       | 0 1 2 | | |  | 
       |    |14 | |  | 
       |    | |26|  | 
       | 3 4 5 | |--+ + - 
       |    |17 | /
       |    |---+ +--> D 
       | 6 7 8 |  /
       +-------------+  + 

     @param matrix a 3D matrix. Element [i,j,k] is A[H*(D*k + j) + i] 
     @param W  width 
     @param H  height 
     @param D  depth 
     @param WW  width in W-sized chunks of target image 
     @param HH  height in H-sized chunks of target image 
     @param filename output filename in PNG format 

     Output image: 


     |<----- WW = 2 --->| 
     +------------------+ - 
     | 0 1 2 9 10 11| | 
     | 3 4 5 12 13 14| | 
     | 6 7 8 15 16 17| HH = 2 
     | 18 19 20   | | 
     | 21 22 23 blank | | 
     | 24 25 26   | | 
     +------------------+ - 

     NOTE: W*WW and H*HH may not exceed 32760. 

     Return: 
       0  success 
       -1  cannot create PNG structure (write) 
       -2  cannot create PNG structure (info) 
       -3  out of memory 
       -4  cannot create output file 

*/ 

int matrix3D_to_png(uint8_t *matrix, size_t W, size_t H, size_t D, size_t WW, size_t HH, char *filename) 
{ 
     FILE   *fp; 
     png_color  palette[16]; 
     png_byte  transparencies[16]; 
     uint32_t  y; 
     size_t   x; 
     uint8_t   *row; 

     if(!(png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL))) 
       return -1; 

     if(!(info_ptr = png_create_info_struct(png_ptr)) || setjmp(png_jmpbuf(png_ptr))){ 
       /* If we get here, libpng had a problem writing */ 
       png_destroy_write_struct(&png_ptr, &info_ptr); 
       return -2; 
     } 

     if (NULL == (row  = malloc(WW*W + 7))) 
     { 
       return -3; 
     } 

     /* Create 16-color palette for representation */ 
     #define SETPAL(i,r,g,b,a)  \ 
     palette[i].red = r; palette[i].green = g; palette[i].blue = b; transparencies[i] = 255-a; 

     // We will draw the matrix in red if points are nonzero, black if zero; outside the matrix 
     // we use transparent white. 
     #define   INDEX_IF_ZERO   0 
     #define   INDEX_IF_NONZERO  3 
     #define   INDEX_IF_BLANK   15 

     SETPAL(0,  0, 0, 0, 0);   // Black 
     SETPAL(1,  255, 255, 255, 0);  // Opaque white 
     SETPAL(2,  192, 192, 192, 0);  // Light gray 

     SETPAL(3,  255, 0,  0, 0); // Red 
     SETPAL(4,  0,  255, 0, 0); // Green 
     SETPAL(5,  0,  0,  255, 0);// Blue 

     SETPAL(6,  255, 0,  0,  128); // Halftransparent red 
     SETPAL(7,  0,  255, 0,  128); // green 
     SETPAL(8,  0,  0,  255, 128); // blue 

     SETPAL(9,  255, 0, 0, 0);   // red again :-) 
     SETPAL(10,  0, 255, 0, 0); 
     SETPAL(11,  0, 0, 255, 0); 
     SETPAL(12,  255, 0, 0, 0); 
     SETPAL(13,  0, 255, 0, 0); 
     SETPAL(14,  0, 0, 255, 0); 

     SETPAL(15,  255, 255, 255, 255); // Transparent white 
     /* End palette */ 

     /* Create filename */ 
     if (NULL == (fp = fopen(filename, "w"))) 
     { 
       fprintf(stderr, "cannot open output '%s': %s\n", filename, strerror(errno)); 
       return -4; 
     } 
     png_init_io(png_ptr, fp); 
     png_set_IHDR(png_ptr, info_ptr, W*WW, H*HH, 8, PNG_COLOR_TYPE_PALETTE, 
           PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); 
     png_set_PLTE(png_ptr, info_ptr, palette, 16); 
     png_set_tRNS(png_ptr, info_ptr, transparencies, 16, NULL); 
     png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); 
     png_write_info(png_ptr, info_ptr); 
     for (y = 0; y < H*HH; y++) 
     { 
       size_t mx = y/H; 
       mx  = (mx*H*WW + (y%H))*W; 
       for (x = 0; x < WW; x++) 
       { 
         if (mx+x*H >= H*D) 
           memset(row+x*W, INDEX_IF_BLANK, W); 
         else 
         { 
           size_t ii; 
           for (ii = 0; ii < W; ii++) 
             row[x*W+ii] = (matrix[mx+x*W*H+ii]) ? INDEX_IF_NONZERO : INDEX_IF_ZERO; 
         } 
       } 
       png_write_row(png_ptr, row); 
     } 
     png_write_end(png_ptr, NULL /*info_ptr*/); 
     png_destroy_write_struct(&png_ptr, &info_ptr); 
     fclose(fp); 
     free(row); 
     return 0; 
} 

int main(int argc, char **argv) 
{ 
     FILE *fp; 
     uint8_t *matrix; 
     size_t W, H, D, WW, HH, i; 
     if (8 != argc) 
     { 
       fprintf(stderr, "Syntax: %s input output.png width height depth TileX TileY\n", *argv); 
       return EXIT_FAILURE; 
     } 
     W  = atol(argv[3]); 
     H  = atol(argv[4]); 
     D  = atol(argv[5]); 
     WW  = atol(argv[6]); 
     HH  = atol(argv[7]); 

     if ((W * WW > 32767)||(H * HH) > 32767) 
     { 
       fprintf(stderr, "Output image would be too large\n"); 
       return EXIT_FAILURE; 
     } 
     if (WW*HH < D) 
     { 
       fprintf(stderr, "WARNING: matrix does not fit into output image\n"); 
     } 
     if (WW*HH > D*2) 
     { 
       fprintf(stderr, "WARNING: output image is far larger than input matrix\n"); 
     } 
     if (NULL == (fp = fopen(argv[1], "r"))) 
     { 
       fprintf(stderr, "Input file not found\n"); 
       return EXIT_FAILURE; 
     } 
     if (NULL == (matrix = malloc(W*H*D))) 
     { 
       fprintf(stderr, "Out of memory: matrix too large\n"); 
       return EXIT_FAILURE; 
     } 
     for (i = 0; i < D; i++) 
     { 
       int ret; 
       if ((int)H != (ret = fread(matrix + W*H*i, W, H, fp))) 
       { 
         fprintf(stderr, "Read error at plane %d (reading %d rows of %d elements, expecting %d, got %d)\n", 
           (int)i, (int)W, (int)H, (int)H, ret); 
         fclose(fp); 
         return EXIT_FAILURE; 
       } 
     } 
     if (matrix3D_to_png(matrix, W, H, D, WW, HH, argv[2])) 
     { 
       fprintf(stderr, "Error in creating output PNG '%s'\n", argv[2]); 
       return EXIT_FAILURE; 
     } 
     return EXIT_SUCCESS; 
}