[squeak-dev] Get raw 24 Bit image data into a Form
leves at elte.hu
Sun Aug 30 17:35:27 UTC 2015
Wouldn't it be better to use raspistill instead of raspiyuv, and generate
a jpg or png file directly?
On Sun, 30 Aug 2015, Herbert König wrote:
> this works with image size of 320 @ 208. On my A+ with a size of 1280*832 Tim's version takes 10-12 seconds without displaying the Form. Levente's
> version takes about 1.5 to 3 seconds. This is already too slow for me.
> https://www.raspberrypi.org/documentation/raspbian/applications/camera.md (search for --rgb)
> suggests that padding for multiples of 16 may occur.
> I thought I would get away with just ignoring the end of the file by changing the test to (extent area * 3 <= file size) as long as x is dividable
> by 16. But already with 1296 at 832 which can both be divided by 16 some padding after each line sets in and the resulting image is garbled if that's
> not taken into account.
> I want 1296 at 972 image size to take advantage of the camera module's binning capability (adding four physical pixels to reduce noise) in my long
> night exposures.
> Finding out the buffer length after which they start padding and accounting for that will not help as it will make the code slower, even if not
> much. If you happen to know the buffer size of raspiyuv, please tell me so I can play a bit.
> Thanks to both for chiming in. I learned something :-))
> | extent result |
> extent := 320 @ 208.
> result := StandardFileStream readOnlyFileNamed: 'sample.yuv' do: [ :file |
> file binary.
> extent area * 3 = file size ifTrue: [
> | word bits form |
> form := Form extent: extent depth: 32.
> bits := form bits.
> word := 16rFF bitShift: 24.
> 1 to: bits size do: [ :i |
> digitAt: 3 put: file next;
> digitAt: 2 put: file next;
> digitAt: 1 put: file next.
> bits at: i put: word ].
> form ] ].
> result display.
> P.S.: This is usually the point when someone comes up with a pure bitblt solution providing further significant speedups.
> On Sat, 29 Aug 2015, tim Rowledge wrote:
> On 29-08-2015, at 8:13 AM, Herbert König <herbertkoenig at gmx.net> wrote:
> how do I go about reading a raw RGB 888 (24 bits deep output from raspiyuv) file into a Form?
> Well we need to understand the file format first to decode it and so far as some quick googling tells me the yuv files are
> completely raw; no header to tell us anything, just a long list of bytes. Since you can control the width and height of
> the image the camera takes (apparently, though it looks like it gets rounded up to 32 pixels in width and 16 in height?) I
> guess we can at least in principle assume the w & d for the data. The RGB888 is pretty much the Squeak pixels format for
> 32bpp anyway so there shouldn’t be too much of a problem.
> take your picture and write to file
> open file as binary in Squeak `myFileStream := (FileStream readOnlyFileNamed: ‘my.yuv’) binary`
> create a Form of appropriate size & depth `myForm := Form extent: width at height depth: 32`
> read bytes from the filestream and stick them in the form’s bits array. There will be issues of byte-endianness to get
> right (squeak bitmaps are for some demented reason big-endian and I’d guess the pi YUV files are little-endian) and you’ll
> have to fill in the top (or bottom, see endianness) byte to set the alpha correctly.
> It’ll be something along the lines of checking the sizes match up, reading the data into the form’s bits array and making
> sure the bits all line up.
> Here’s a quick example from my pi2, since it tickled my curiousity
> in terminal - `raspiyuv -w 320 -h 208 -rgb -o smple.yuv`
> in Squeak
> Form extent: 320 at 208 depth: 32 -> inspect it
> in the inspector -
> |myfile alpha|
> myfile := FileStream readOnlyFileNamed: ‘/home/pi/sample.yuv’.
> myfile binary.
> bits size * 3 = myfile size ifFalse:[^nil].
> alpha := 16rFF<<24.
> 1 to: bits size do: [ :i| |val|
> val := myfile next.
> val := val <<8 + myfile next.
> val := val <<8 + myfile next.
> val := alpha bitOr: val.
> bits at: i put: val].
> myfile close
> self display
> I get a pretty decent image displayed. Takes 250 mSec to read in on my pi2 with a cog-spur squeak. A bit over half that is
> the cost of using the largeinteger ‘alpha’ to set the proper alpha value for each pixel. You *can* leave that out if
> you’re going to simply do ‘myform display’ since the raw bitblt ignores the alpha. If you are going to be examining the
> pixels as just rgb values, save the time - I see 120mS in that case.
> Obviously once you have the general format sorted it ought to get moved into Form and tidied up as From
> class>>readRGBFromFileNamed: or similar.
> tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim
> Useful random insult:- If you give him a penny for his thoughts, you get change back.
More information about the Squeak-dev