Мне нужно отправлять изображения с разрешением 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, а затем отобразить его на дисплее электронной бумаги?
Заранее спасибо за ваше время и помощь:)