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