python rgba转rgb_python转码utf-8

Python (5) 2024-07-26 18:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
python rgba转rgb_python转码utf-8,希望能够帮助你!!!。

python rgba转rgb_python转码utf-8_https://bianchenghao6.com/blog_Python_第1张

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

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

发表回复