public static ByteBuffer getScaledMatrix(Bitmap bitmap, int[] ddims) { ByteBuffer imgData = ByteBuffer.allocateDirect(ddims[0] * ddims[1] * ddims[2] * ddims[3] * 4); //ddims=[1, 3, 224, 224] imgData.order(ByteOrder.nativeOrder()); // get image pixel int[] pixels = new int[ddims[2] * ddims[3]]; Bitmap bm = Bitmap.createScaledBitmap(bitmap, ddims[2], ddims[3], false); bm.getPixels(pixels, 0, bm.getWidth(), 0, 0, ddims[2], ddims[3]); int pixel = 0; for (int i = 0; i < ddims[2]; ++i) { for (int j = 0; j < ddims[3]; ++j) { final int val = pixels[pixel++]; imgData.putFloat(((((val >> 16) & 0xFF) - 128f) / 128f)); imgData.putFloat(((((val >> 8) & 0xFF) - 128f) / 128f)); imgData.putFloat((((val & 0xFF) - 128f) / 128f)); } } if (bm.isRecycled()) { bm.recycle(); } return imgData; }
时间: 2023-03-01 08:58:51 浏览: 215
& 0xFF) - IMAGE_MEAN) / IMAGE_STD)); imgData.putFloat(((((val >> 8) & 0xFF) - IMAGE_MEAN) / IMAGE_STD)); imgData.putFloat((((val) & 0xFF) - IMAGE_MEAN) / IMAGE_STD); pixel++; } } return imgData; }这段代码的目的是将位图图像转换为ByteBuffer,以便进行图像处理。
相关问题
这个是我的代码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; }
您的代码已经实现了将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类。
public class Main { private static byte STX = 0x02; // 2 开始位 //private static byte Rand = AccesscEntrty.ACCRandom();//随机数 public static void main(String[] args) { Main dynamicBuffer = new Main(); dynamicBuffer.put(new byte[] {STX,0x2C}); byte[] result = dynamicBuffer.toArray(); for (byte b : result) { System.out.println(b); } } private static final int INITIAL_SIZE = 9; private byte[] data; private ByteBuffer byteBuffer; public void DynamicByteBuffer() { data = new byte[INITIAL_SIZE]; byteBuffer = ByteBuffer.wrap(data); } public void put(byte[] newData) { int requiredCapacity = byteBuffer.position() + newData.length; if (requiredCapacity > data.length) { int newSize = Math.max(data.length * 2, requiredCapacity); byte[] newDataArray = new byte[newSize]; System.arraycopy(data, 0, newDataArray, 0, byteBuffer.position()); data = newDataArray; byteBuffer = ByteBuffer.wrap(data); } byteBuffer.put(newData); } public byte[] toArray() { return Arrays.copyOf(data, byteBuffer.position()); } }为什么运行错误哪里可以改进
该代码存在以下问题:
1. `DynamicByteBuffer()` 方法名应该改为构造方法名 `Main()`;
2. `Rand` 变量没有定义,可能会导致编译错误,建议注释掉该行代码;
3. `put()` 方法中的 `byteBuffer.put(newData)` 应该改为 `byteBuffer.put(newData, 0, newData.length)`,因为 `newData` 数组可能比 `byteBuffer` 剩余的空间大,这会导致 `BufferOverflowException` 异常;
4. `put()` 方法中的 `if (requiredCapacity > data.length)` 语句中的判断条件应该改为 `requiredCapacity > byteBuffer.capacity()`,因为 `data.length` 在之后可能被扩容,但是 `byteBuffer.capacity()` 不会改变。
下面是修改后的代码:
```java
import java.nio.ByteBuffer;
import java.util.Arrays;
public class Main {
private static byte STX = 0x02; // 2 开始位
//private static byte Rand = AccesscEntrty.ACCRandom();//随机数
public static void main(String[] args) {
Main dynamicBuffer = new Main();
dynamicBuffer.put(new byte[] {STX, 0x2C});
byte[] result = dynamicBuffer.toArray();
for (byte b : result) {
System.out.println(b);
}
}
private static final int INITIAL_SIZE = 9;
private byte[] data;
private ByteBuffer byteBuffer;
public Main() {
data = new byte[INITIAL_SIZE];
byteBuffer = ByteBuffer.wrap(data);
}
public void put(byte[] newData) {
int requiredCapacity = byteBuffer.position() + newData.length;
if (requiredCapacity > byteBuffer.capacity()) {
int newSize = Math.max(byteBuffer.capacity() * 2, requiredCapacity);
byte[] newDataArray = Arrays.copyOf(data, newSize);
byteBuffer = ByteBuffer.wrap(newDataArray);
byteBuffer.position(data.length);
}
byteBuffer.put(newData, 0, newData.length);
}
public byte[] toArray() {
return Arrays.copyOf(data, byteBuffer.position());
}
}
```
阅读全文