Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [january-dev] Reshaping and slicing RGBA image byte buffer for android screen capture

Apparently the slowness was due to debug mode.

It almost works. Current result is this:



From: january-dev-bounces@xxxxxxxxxxx <january-dev-bounces@xxxxxxxxxxx> On Behalf Of Yannick De Visscher
Sent: dinsdag 25 juni 2019 11:52
To: january-dev@xxxxxxxxxxx
Cc: Erwin De Ley <>
Subject: [january-dev] Reshaping and slicing RGBA image byte buffer for android screen capture


Erwin contacted you earlier today about slicing an image represented in a bytebuffer (on android).
I’m trying to accomplish this with a CompoundByteDataset as suggested by Peter, but I’m having some problems.
Below is my current code. I’ve added some additional comments marked in yellow
Could someone point me in the right direction here?
private class ImageAvailableListener implements ImageReader.OnImageAvailableListener {
private ByteBuffer imageBuffer;

public void onImageAvailable(ImageReader reader) {
try (Image latestImage = imageReader.acquireLatestImage()) {
if (latestImage == null) {

final Image.Plane plane = latestImage.getPlanes()[0];
final ByteBuffer buffer = plane.getBuffer();

if (imageBuffer == null) {
// prepare a buffer for ABGR to ARGB conversion
imageBuffer = ByteBuffer.allocateDirect(buffer.capacity());
// clear the buffer and reset to position 0

int width = latestImage.getWidth();
int height = latestImage.getHeight();

int pixelStride = plane.getPixelStride();
int rowStride = plane.getRowStride();
int rowPadding = rowStride - (pixelStride * width);

// convert from ABGR to ARGB to get the correct color space for OpenTOK
RoboticChameleon.fromABGR().toARGB(buffer, rowStride, imageBuffer, rowStride, width, height);

int paddedWidth = width + (rowPadding / pixelStride);
if (paddedWidth > width) {
// we need to remove padding on the right side of this image (some devices show this behaviour in portrait mode)
int size = rowStride * height;    -> had to define a new byte array, since the byte array backed by the buffer had 7 extra bytes (which caused the reshaping to fail)
byte[] pixels = new byte[size];
imageBuffer.get(pixels, 0, size);

// create a compound dataset with itemsize 4 (RGBA pixel) and reshape it
Dataset dataset = DatasetFactory.createFromObject(4, CompoundByteDataset.class, pixels, rowStride / pixelStride, height);

// slice to width and height
Dataset slicedDataset = dataset.getSlice(new Slice(0, width), new Slice(0, height));   -> this takes a very long time

// convert the sliced dataset back to a byte array
imageBuffer.put(((CompoundDataset) slicedDataset.flatten()).getByteArray());    -> not sure about this

//                frame = new Frame(imageBuffer, paddedWidth, height);
frame = new Frame(imageBuffer, width, height);
= true;

catch (Exception e) {
LOG_TAG, "Error processing screen capture frame");
This is an example image, from which I want to remove the black bar on the right.
Kind regards,


Back to the top