У меня есть две фотографии, одна увеличенная, а вторая - широкоугольная.Рассмотрим первое изображение как обрезку второго (хотя это не так).Я выбираю один пиксель из каждой фотографии, которая представляет одну и ту же вещь на обеих фотографиях (скажем, человеческий нос).Я накладываю первое изображение с некоторой прозрачностью поверх второго изображения, выравнивая два выбранных пикселя?
Теперь я хочу масштабировать второе изображение, пока первое изображение практически не исчезнет, поскольку масштаб второго изображения совпадаетмасштаб первого.
Я использую OpenImaj и успешно выполнил это с помощью MBFImage.overlayInPlace ().У меня проблема в том, что когда я использую ResizeProcessor для масштабирования второго изображения, я получаю «OutOfMemoryError: Java Heap Space», если мне нужно масштабировать второе изображение слишком много (> 5x).
Я столкнулсядо -Xmx до 12G, используя JDK 12 64bit.Я пробовал ResizeProcessor, BilinearInterpolation и BicubicInterpolation resizer все с одинаковым результатом.
Вот мой метод с моей последней попыткой.В зависимости от того, сколько памяти я отдаю JVM, иногда происходит сбой при изменении размера, в других случаях происходит сбой в toRGB ():
private MBFImage scaleImage2(float scaleFactor) throws IOException {
FImage img2Flat = image2.flatten();
int width = (int)Math.round(img2Flat.getWidth() * scaleFactor);
int height = (int)Math.round(img2Flat.getHeight() * scaleFactor);
BilinearInterpolation resizer = new BilinearInterpolation(width, height, 1/scaleFactor);
resizer.processImage(img2Flat);
return img2Flat.toRGB();
}
Вот где я накладываю изображения:
private MBFImage createScaledOverlay() {
MBFImage scaledImg2 = null;
if(scaledLastCrop == null) {
try {
scaledLastCrop = scaleLastCrop();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
scaledImg2 = scaleImage2(image2ScaleFactor);
} catch (IOException e) {
e.printStackTrace();
}
int img2ScaledPixelx = Math.round(image2SelectedPixel.x * image2ScaleFactor);
int img2ScaledPixely = Math.round(image2SelectedPixel.y * image2ScaleFactor);
int lastCropScaledPixelx = (int)Math.round(lastCropSelectedPixel.x * lastCropScaleFactor);
int lastCropScaledPixely = (int)Math.round(lastCropSelectedPixel.y * lastCropScaleFactor);
scaledImg2.overlayInplace(scaledLastCrop, img2ScaledPixelx - lastCropScaledPixelx, img2ScaledPixely - lastCropScaledPixely);
return scaledImg2;
}
У меня все в порядке с одним из двух путей вперед:
- Исправлено OutOfMemoryError
- Другой подход к наложению двух изображений