Java конвертирует BufferedImage в HEX Array для использования Arduino с 7,5-дюймовым дисплеем для электронной бумаги - PullRequest
0 голосов
/ 15 января 2020

Мне нужно отправлять изображения с разрешением 640x384 (из-за 7,5-дюймового дисплея E-Ink от WaveShare) из моего Spring Boot Backend в Arduino UNO Wifi rev 2 и для отображения такого изображения оно мне нужно в формате HEX Array, как вы можете видеть здесь

И это мой текущий Java код

@RequestMapping(value = "/test", method = RequestMethod.GET)
public ResponseEntity<String> test() {

    List<Display> list = displayRepository.findAll();
    int[] pixels;
    InputStream in = new ByteArrayInputStream(list.get(0).getImage());
    try {
        BufferedImage bImageFromConvert = ImageIO.read(in);
        pixels = convertTo2DWithoutUsingGetRGB(bImageFromConvert);

        ByteBuffer byteBuffer = ByteBuffer.allocate(pixels.length * 4);
        IntBuffer intBuffer = byteBuffer.asIntBuffer();
        intBuffer.put(pixels);

        byte[] array = byteBuffer.array();


        return new ResponseEntity<>(encodeHexString(array), HttpStatus.OK);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return new ResponseEntity<>(null, HttpStatus.OK);
}

private static int[] convertTo2DWithoutUsingGetRGB(BufferedImage image) {

    final byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
    final int width = image.getWidth();
    final int height = image.getHeight();
    final boolean hasAlphaChannel = image.getAlphaRaster() != null;

    int[] result = new int[width*height];
    if (hasAlphaChannel) {
        final int pixelLength = 4;
        for (int pixel = 0, index = 0; pixel + 3 < pixels.length; pixel += pixelLength) {
            int argb = 0;
            argb += (((int) pixels[pixel] & 0xff) << 24); // alpha
            argb += ((int) pixels[pixel + 1] & 0xff); // blue
            argb += (((int) pixels[pixel + 2] & 0xff) << 8); // green
            argb += (((int) pixels[pixel + 3] & 0xff) << 16); // red
            result[index] = argb;
            index++;
        }
    } else {
        final int pixelLength = 3;
        for (int pixel = 0, index = 0; pixel + 2 < pixels.length; pixel += pixelLength) {
            int argb = 0;
            argb += -16777216; // 255 alpha
            argb += ((int) pixels[pixel] & 0xff); // blue
            argb += (((int) pixels[pixel + 1] & 0xff) << 8); // green
            argb += (((int) pixels[pixel + 2] & 0xff) << 16); // red
            result[index] = argb;
            index++;
        }
    }

    return result;
}

public String encodeHexString(byte[] byteArray) {
    StringBuffer hexStringBuffer = new StringBuffer();
    String prefix = "";
    for (int i = 0; i < byteArray.length; i++) {
        hexStringBuffer.append(prefix);
        prefix = ",";
        hexStringBuffer.append("0x"+byteToHex(byteArray[i]));
    }
    return hexStringBuffer.toString();
}

public String byteToHex(byte num) {
    char[] hexDigits = new char[2];
    hexDigits[0] = Character.forDigit((num >> 4) & 0xF, 16);
    hexDigits[1] = Character.forDigit((num & 0xF), 16);
    return new String(hexDigits);
}

Но если я go до https://javl.github.io/image2cpp/ шестнадцатеричный массив не отображается изображение, которое я создал.

Как правильно преобразовать его? Или кто-нибудь знает лучший способ отправить изображение в Ardunino, а затем отобразить его на дисплее электронной бумаги?

Заранее спасибо за ваше время и помощь:)

...