2017-08-09 38 views
0

現在、Python 2.7を使用して一連のビットマップからピクセル情報を取得し、24ビットの情報をファイルに書き出します(任意の拡張子 ".bfs"パイプラインを見つけるのを容易にするため)、位置xの8ビット、位置yの8ビット、色の16ビット。Pythonでファイルに書き込む、Arduinoでファイルを読み込む

0, 0, 40208 
1, 0, 33544 
2, 0, 33544 
3, 0, 39952 
4, 0, 39944 
5, 0, 33544 
6, 0, 39688 
7, 0, 39952 
8, 0, 39944 
9, 0, 33544 
10, 0, 33800 
11, 0, 39952 
12, 0, 39952 
13, 0, 33544 
14, 0, 33800 
15, 0, 48400 

ここから:PC側のすべては、私は(これは、I出力とフォーマットは読みやすくするためにことを.txtファイルからコピーされた)期待してどのようにきれいに出ている上

from PIL import Image 
import struct 

filename = raw_input('Please choose destination filename: ') 

file_in = [0]*27 
im = [0]*27 

for i in range(1,27): 
    file_in[i] = str(i)+".bmp" 
    im[i] = Image.open(file_in[i]) 

file_out = open(filename+".bfs", 'w') 
readable_out = open(filename+".txt", 'w') 

for q in range(1,27):  
    pix = im[q].load() 
    width, height = im[q].size 
    for y in range (height): 
     for x in range (width): 
      rgb = pix[x,y] 

      red = rgb[0] 
      green = rgb[1] 
      blue = rgb[2] 

      Uint16_val = (((31*(red+4))/255)<<11) | (((63*(green+2))/255)<<5) | ((31*(blue+4))/255) 
      hex_16 = int('%.4x'%Uint16_val, 16) 
      print(str(x)+", "+str(y)+", "+str(hex_16)+"\n") 

      readable_out.write(str(x)+", "+str(y)+", "+str(hex_16)+"\n") 

      file_out.write(struct.pack('<1B', x)) 
      file_out.write(struct.pack('<1B', y)) 
      file_out.write(struct.pack('<1H', hex_16)) 

私は.bfsファイルを取って、Arduino Unoが読むためにSDカードにロードしています。 Arduinoのコードは、SDカードから読み込み、x、y、および色の値をTFT LCDに出力することになっています。私はTFTに送信する前にカードから読み取ったコードの周りにいくつかのprint文を持っており、代わりに私が書いた(と思う)というファイルを一致させることは、このように出力

#include <Adafruit_GFX.h> // Core graphics library 
#include <Adafruit_ST7735.h> // Hardware-specific library 
#include <SPI.h> 
#include <SD.h> 

#define TFT_CS 10 // Chip select line for TFT display 
#define TFT_RST 9 // Reset line for TFT (or see below...) 
#define TFT_DC 8 // Data/command line for TFT 

#define SD_CS 4 // Chip select line for SD card 

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); 

void setup(void) { 
    Serial.begin(9600); 

    tft.initR(INITR_144GREENTAB); 


    Serial.print("Initializing SD card..."); 
    if (!SD.begin(SD_CS)) { 
    Serial.println("failed!"); 
    return; 
    } 
    Serial.println("OK!"); 

tft.fillScreen(0x0000); 
} 

uint32_t pos = 0; 
uint8_t x,y; 
uint8_t buffpix[3]; 
uint16_t c; 

void loop() { 
bfsDraw("image.bfs"); 
} 

#define BUFFPIXEL 20 

void bfsDraw(char *filename) { 

    File  bfsFile; 
    int  w, h, row, col; 
    uint8_t x,y; 
    uint16_t c; 
    uint32_t pos = 0, startTime = millis(); 

    if((0 >= tft.width()) || (0 >= tft.height())) return; 

    if ((bfsFile = SD.open(filename)) == NULL) { 
    Serial.print("File not found"); 
    return; 
    } 
     w = 128; 
     h = 128; 
     tft.setAddrWindow(0, 0, 0+w-1, 0+h-1); 

     for (row=0; row<h; row++) { 
      for (col=0; col<w; col++) { 
      x = bfsFile.read(); 
      Serial.print(x); 
      Serial.print(", "); 
      y = bfsFile.read(); 
      Serial.print(y); 
      Serial.print(", "); 
      c = read16(bfsFile); 
      Serial.print(c); 
      Serial.print(" "); 
      Serial.println(" "); 
      tft.drawPixel(x,y,c); 
      } 
     } 
    } 

uint8_t read8(File f) { 
    uint16_t result; 
    ((uint8_t *)&result)[0] = f.read(); 
    return result; 
} 

uint16_t read16(File f) { 
    uint16_t result; 
    ((uint8_t *)&result)[0] = f.read(); 
    ((uint8_t *)&result)[1] = f.read(); 
    return result; 
} 

:ここではArduinoのコードです:あなたが見ることができるように

0, 0, 40208 
1, 0, 33544 
2, 0, 33544 
3, 0, 39952 
4, 0, 39944 
5, 0, 33544 
6, 0, 39688 
7, 0, 39952 
8, 0, 39944 
9, 0, 33544 
13, 10, 2048 
132, 11, 4096 
156, 12, 4096 

アルドゥイーノからの読み込みは、Pythonスクリプトの書き込みをマッチングから始まりますが、9の後に「X」のバイトは、ミドル代わりの先頭位置にシフトしています。私の質問は、このシフトを引き起こしているのは、x = 9の後ですか?これはリトルエンディアンとビッグエンディアンの問題ですか?

ありがとうございました!

答えて

0

バイナリモードではなく、テキストモードでファイルを開いた。 Windowsでは、書き込むすべての改行文字(バイト値10)が改行+改行(バイト値13、10)に変換されることを意味します。 .bfsファイルを開くときは、'wb'を使用してください。

各ピクセルの座標をファイルに書き込むことは狂っていることに注意してください。ファイルのサイズは倍増しているため、まったく効果はありません。ファイルを読んでいるときに座標を簡単に再現することができます。実際には、すでに実行していますが、rowcol変数の形で簡単に再作成できます。

+0

これはトリックでした!ファイルの最適化についてのアドバイスもありがとうございます。実際には、フレーム間で繰り返される色/座標シーケンスを削除するなど、いくつかの圧縮技術を上流に実装する予定です。これは、ファイルサイズを大幅に(複雑さによって)助けなければなりません。私が何をやっているのか分かっていたら、私は嘘をついていただろうが、私はこの事をビデオにすることを望んでいる。私はRPi(速い方法)でそれを行うことができました、そしてほとんどの人はそれが不可能だと言うが、この男は同意しないようだ: http://blog.vinu.co.in/2012/06/avr-video-player -on-nokia-color-lcd.html ありがとうございます! – user3596565

関連する問題