这个是我的代码public static byte[] base64ToBGR(String base64Image) { String prefix = "data:image/png;base64,"; String base64 = ""; if (base64Image.startsWith(prefix)) { base64 = base64Image.substring(prefix.length()); } else { base64 = base64Image; } byte[] bytes = Base64.decode(base64, Base64.DEFAULT); Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); int width = bitmap.getWidth(); int height = bitmap.getHeight(); int[] pixels = new int[width * height]; bitmap.getPixels(pixels, 0, width, 0, 0, width, height); byte[] bgrData = new byte[width * height * 3]; ByteBuffer buffer = ByteBuffer.wrap(bgrData); int numThreads = Runtime.getRuntime().availableProcessors(); // 获取可用的处理器核心数 ExecutorService executor = Executors.newFixedThreadPool(numThreads); List<Callable<Void>> tasks = new ArrayList<>(); for (int i = 0; i < height; i++) { final int row = i; Callable<Void> task = () -> { int rowStart = row * width; int rowEnd = rowStart + width; for (int j = rowStart; j < rowEnd; j++) { int pixel = pixels[j]; byte b = (byte) Color.blue(pixel); byte g = (byte) Color.green(pixel); byte r = (byte) Color.red(pixel); buffer.put(b); buffer.put(g); buffer.put(r); } return null; }; tasks.add(task); } try { executor.invokeAll(tasks); } catch (InterruptedException e) { e.printStackTrace(); } executor.shutdown(); return bgrData; }
时间: 2024-02-14 21:06:14 浏览: 104
Java Base64位编码与String字符串的相互转换,Base64与Bitmap的相互转换实例代码
您的代码已经实现了将Base64编码的图像转换为BGR格式的字节数组,但是您的代码还有一些可以改进的地方:
1. 您的代码处理图像的方式是使用Android的Bitmap类,而不是Java的BufferedImage类。这样做会导致您的代码无法在非Android环境下使用,建议使用Java标准库的类来处理图像。
2. 您的代码使用了多线程来处理像素,这是一个很好的优化手段,但是在像素数量较少的情况下,多线程会带来额外的开销。建议使用一些启发式算法来判断是否需要使用多线程。
3. 您的代码中使用了Callable和Future来处理多线程任务,这是一种比较复杂的方式,可以使用Java 8中的Stream和parallelStream方法来简化多线程操作。
4. 您的代码中使用了Android的Color类来获取像素的RGB值,这会导致您的代码无法在非Android环境下使用。建议使用Java标准库的方法来获取像素的RGB值。
以下是改进后的代码:
```java
public static byte[] base64ToBGR(String base64Image) {
String prefix = "data:image/png;base64,";
String base64 = "";
if (base64Image.startsWith(prefix)) {
base64 = base64Image.substring(prefix.length());
} else {
base64 = base64Image;
}
byte[] bytes = Base64.getDecoder().decode(base64);
BufferedImage image = null;
try {
image = ImageIO.read(new ByteArrayInputStream(bytes));
} catch (IOException e) {
e.printStackTrace();
}
int width = image.getWidth();
int height = image.getHeight();
byte[] bgrData = new byte[width * height * 3];
IntStream.range(0, height).parallel().forEach(y -> {
int rowStart = y * width;
int rowEnd = rowStart + width;
for (int x = rowStart; x < rowEnd; x++) {
int pixel = image.getRGB(x % width, y);
bgrData[(y * width + x) * 3] = (byte)((pixel >> 16) & 0xFF);
bgrData[(y * width + x) * 3 + 1] = (byte)((pixel >> 8) & 0xFF);
bgrData[(y * width + x) * 3 + 2] = (byte)(pixel & 0xFF);
}
});
return bgrData;
}
```
改进后的代码使用了Java标准库的类来处理图像,并且使用了Java 8的Stream和parallelStream方法来简化多线程操作。同时,使用了IntStream.range方法来生成像素的迭代范围,避免了使用双重循环的形式。此外,使用了位运算来获取像素的RGB值,避免了使用Android的Color类。
阅读全文