Tôi đang cố gắng áp dụng bộ lọc pha trộn trên hai hình ảnh (trong trường hợp này là HardLight). HardLight không được hỗ trợ trong thư viện Android cơ sở, vì vậy, tôi đang làm điều đó bằng tay trên mỗi pixel. Chạy đầu tiên đang hoạt động, nhưng tốc độ ít hơn sao. Tạo hình ảnh 500x500 từ hình ảnh 500x500 cơ sở và bộ lọc 500x500 mất quá nhiều thời gian. Đoạn mã này cũng được sử dụng để tạo ra các hình thu nhỏ (72x72), và nó không thể tách rời với cốt lõi của ứng dụng. Tôi rất thích một số lời khuyên và/hoặc gợi ý về cách tăng tốc độ này.Tối ưu hóa mỗi Pixel Blending trên Android Bitmaps
Nếu lợi ích lớn có thể được thực hiện bằng cách giả định rằng cả hai hình ảnh sẽ không có alpha, điều đó là tốt. CHÚ Ý: BlendMode và alpha là các giá trị không được sử dụng trong ví dụ (BlendMode sẽ chọn loại hỗn hợp, trong trường hợp này là Hardcoded HardLight).
public Bitmap blendedBitmap(Bitmap source, Bitmap layer, BlendMode blendMode, float alpha) {
Bitmap base = source.copy(Config.ARGB_8888, true);
Bitmap blend = layer.copy(Config.ARGB_8888, false);
IntBuffer buffBase = IntBuffer.allocate(base.getWidth() * base.getHeight());
base.copyPixelsToBuffer(buffBase);
buffBase.rewind();
IntBuffer buffBlend = IntBuffer.allocate(blend.getWidth() * blend.getHeight());
blend.copyPixelsToBuffer(buffBlend);
buffBlend.rewind();
IntBuffer buffOut = IntBuffer.allocate(base.getWidth() * base.getHeight());
buffOut.rewind();
while (buffOut.position() < buffOut.limit()) {
int filterInt = buffBlend.get();
int srcInt = buffBase.get();
int redValueFilter = Color.red(filterInt);
int greenValueFilter = Color.green(filterInt);
int blueValueFilter = Color.blue(filterInt);
int redValueSrc = Color.red(srcInt);
int greenValueSrc = Color.green(srcInt);
int blueValueSrc = Color.blue(srcInt);
int redValueFinal = hardlight(redValueFilter, redValueSrc);
int greenValueFinal = hardlight(greenValueFilter, greenValueSrc);
int blueValueFinal = hardlight(blueValueFilter, blueValueSrc);
int pixel = Color.argb(255, redValueFinal, greenValueFinal, blueValueFinal);
buffOut.put(pixel);
}
buffOut.rewind();
base.copyPixelsFromBuffer(buffOut);
blend.recycle();
return base;
}
private int hardlight(int in1, int in2) {
float image = (float)in2;
float mask = (float)in1;
return ((int)((image < 128) ? (2 * mask * image/255):(255 - 2 * (255 - mask) * (255 - image)/255)));
}
Xin chào, bạn có thể giúp tôi về cách sử dụng alpha trong chức năng này không? –