python rgb565,24位bmp到RGB565文件转换

I want to convert 24 bit bmp files to RGB565 format to write to a serial TFT colour display.

The size of the 24bit bmp will always be 320x240 pixels as my TFT display is 320x240

Has anyone any experience of doing this? It could be C/C++, Shell, Python, Java Script and so on...

解决方案

I would use either NetPBM (much smaller and lighter-weight) or ImageMagick (much bigger installation) to convert the BMP into a format that is simple to parse and then use Perl to convert that to RGB565 format.

I assume you are planning to write the RGB565 data to a frame buffer, so you would do something like:

./bmp2rgb565 image.bmp > /dev/fb1

So, save the following as bmp2rgb565:

#!/bin/bash

################################################################################

# bmp2rgb565

# Mark Setchell

################################################################################

if [ $# -ne 1 ]; then

echo Usage: $0 image.bmp

exit 1

fi

file=$1

# Use NetPBM's "bmptopnm" to convert BMP to PNM for easy reading

# You could use ImageMagick: convert "$file" PNM: | perl ...

bmptopnm "$file" 2> /dev/null |

perl -e '

my $debug=0; # Change to 1 for debugging

# Discard first 3 lines of PNM header:

# P3

# 320 240

# 255

my $line=; $line=; $line=;

# Read file, 3 RGB bytes at a time

{

local $/ = \3;

while(my $pixel=){

# Extract 8-bit R,G and B from pixel

my ($r,$g,$b)=unpack("CCC",$pixel);

printf("R/G/B: %d/%d/%d\n",$r,$g,$b) if $debug;

# Convert to RGB565

my $r5=$r>>3;

my $g6=$g>>2;

my $b5=$b>>3;

my $rgb565 = ($r5<<11) | ($g6<<5) | $b5;

# Convert to little-endian 16-bit (VAX order) and write 2 bytes

my $v=pack("v",$rgb565);

syswrite(STDOUT,$v,2);

}

}

'

I don't have a frame buffer handy to test, but it should be pretty close.

Note that you could make the code more robust by starting off with:

convert "$file" -depth 8 -resize 320x240\! PNM: | perl ...

which would make sure the image always matches the framebuffer size, and that it is 8-bit and not 16-bit. You may also want a -flip or -flop in there if the BMP image is upside-down or back-to-front.

Note that if you use ImageMagick convert, the code will work for GIFs, TIFFs, JPEGs, PNGs and around 150 other formats as well as BMP.

Note that if you want to test the code, you can generate a black image with ImageMagick like this:

convert -size 320x240 xc:black BMP3:black.bmp

and then look for a bunch of zeroes in the output if you run:

./bmp2rgb565 black.bmp | xxd -g2

Likewise, you can generate a white image and look for a bunch of ffs:

convert -size 320x240 xc:red BMP3:white.bmp

And so on with red, green and blue:

convert -size 320x240 xc:red BMP3:red.bmp

convert -size 320x240 xc:lime BMP3:green.bmp

convert -size 320x240 xc:blue BMP3:blue.bmp

# Or make a cyan-magenta gradient image

convert -size 320x240 gradient:cyan-magenta cyan-magenta-gradient.bmp

Example:

./RGB565 red.bmp | xxd -g2 | more

00000000: 00f8 00f8 00f8 00f8 00f8 00f8 00f8 00f8 ................

00000010: 00f8 00f8 00f8 00f8 00f8 00f8 00f8 00f8 ................

Example:

./RGB565 blue.bmp | xxd -g2 | more

00000000: 1f00 1f00 1f00 1f00 1f00 1f00 1f00 1f00 ................

00000010: 1f00 1f00 1f00 1f00 1f00 1f00 1f00 1f00 ................

Keywords: RGB565, rgb565, framebuffer, frame-buffer, pack, unpack, Perl, BMP, PGM, image, Raspberry Pi, RASPI

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值