Tôi đang đập đầu vào một bức tường ở đây, và tôi khá chắc chắn tôi đang làm điều gì đó ngu ngốc, vì vậy thời gian để làm cho sự ngu xuẩn của tôi công khai.Điểm ảnh trộn từ hai ảnh bitmap
Tôi đang cố gắng chụp hai hình ảnh, trộn chúng lại với nhau thành hình ảnh thứ ba bằng cách sử dụng các thuật toán trộn chuẩn (Hardlight, softlight, overlay, multiply, vv).
Vì Android không có các thuộc tính pha trộn như vậy, tôi đã đi xuống đường dẫn lấy từng pixel và kết hợp chúng bằng thuật toán. Tuy nhiên, kết quả là rác. Dưới đây là kết quả của sự pha trộn nhân đơn giản (hình ảnh được sử dụng và kết quả mong đợi).
BASE:
Blend:
DỰ KIẾN KẾT QUẢ:
RÁC KẾT QUẢ:
Bất kỳ trợ giúp sẽ được đánh giá cao. Dưới đây là mã, mà tôi đã cố gắng để loại bỏ tất cả các "rác", nhưng một số có thể đã làm cho nó thông qua. Tôi sẽ làm sạch nó nếu một cái gì đó không rõ ràng.
ImageView imageView = (ImageView) findViewById(R.id.ImageView01);
Bitmap base = BitmapFactory.decodeResource(getResources(), R.drawable.base);
Bitmap result = base.copy(Bitmap.Config.RGB_565, true);
Bitmap blend = BitmapFactory.decodeResource(getResources(), R.drawable.blend);
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 = multiply(redValueFilter, redValueSrc);
int greenValueFinal = multiply(greenValueFilter, greenValueSrc);
int blueValueFinal = multiply(blueValueFilter, blueValueSrc);
int pixel = Color.argb(255, redValueFinal, greenValueFinal, blueValueFinal);
buffOut.put(pixel);
}
buffOut.rewind();
result.copyPixelsFromBuffer(buffOut);
BitmapDrawable drawable = new BitmapDrawable(getResources(), result);
imageView.setImageDrawable(drawable);
}
int multiply(int in1, int in2) {
return in1 * in2/255;
}
Kevin, cảm ơn sự giúp đỡ. Tôi không sử dụng hình ảnh với độ trong suốt, vì vậy độ mờ sẽ luôn là 1. Tôi đã cập nhật ví dụ với hình ảnh và làm sạch mã. – MarkPowell
Hmm cảm ơn các hình ảnh - đó thực sự là kết quả rác. Tôi không có quyền truy cập vào một môi trường Android dev vào lúc này, nhưng tôi tự hỏi nếu nó không có gì để làm với mật độ điểm ảnh của Bitmap - có vẻ như Bitmap của bạn đang sử dụng không gian màu RGB565, nhưng nó dường như từ các tài liệu mà Color hoạt động trong không gian ARGB4444. Tôi đã không phân tích cú pháp thông qua tất cả các tài liệu Bitmap/Color để xem cách/nếu chuyển đổi này được xử lý tự động, nhưng có thể đáng để kiểm tra cho đến khi tôi có thể thực hiện một số thử nghiệm trên nền tảng thực tế. –
Được rồi, tôi đã chơi với nó một chút và tôi đã có thể tái tạo kết quả 'rác' của bạn, và tôi đã làm cho nó hoạt động theo hai cách khác nhau.Tôi sẽ cố gắng thay đổi câu trả lời ban đầu để phản ánh điều này. –