Как объединять изображения и накладывать друг на друга
Предположим, я загружаю два или более двух фото в некоторых Framelayout
, Настоящим я загружаю три фотографии с одним человеком в трех разных позициях на всех этих трех фотографиях. Затем, какие библиотеки обработки изображений в Android, Java или Native доступны для выполнения чего-либо, как показано на рисунке.
Я хотел бы наложить несколько картинок друг на друга.
Примерно так:-
Одна идея состоит в том, чтобы:
- Сделайте несколько слоев во всех этих изображениях и найдите несоответствующие области на фотографиях и объедините их.
Как можно объединить несколько картинок с другими? Проверяя двойственность и сливаясь друг с другом?
Существуют ли какие-либо сторонние API-интерфейсы или некоторые службы Photoshop, которые могут помочь мне в такой обработке изображений?
4 ответа
В этом случае вы не просто пытаетесь объединить изображения. Вы действительно хотите объединить сцену, содержащую один и тот же объект в разных позициях.
Следовательно, это не просто простая комбинация или альфа-композиция, где цвет данного пикселя в выходном изображении представляет собой сумму значений этого пикселя в каждом изображении, деленную на количество изображений.
В этом случае вы можете сделать:
- Определите фон сцены, анализируя пиксели, которые не меняются, учитывая несколько изображений.
- Начните с выходного изображения, являющегося просто фоном.
- Для каждого изображения удалите фон, чтобы получить нужный объект, и объедините его с выходным изображением.
Для выполнения этой задачи существует плагин Marvin, который называется MergePhoto. Программа ниже использует этот плагин для объединения набора фотографий паркура.
import marvin.image.MarvinImage;
import marvin.io.MarvinImageIO;
import marvin.plugin.MarvinImagePlugin;
import marvin.util.MarvinPluginLoader;
public class MergePhotosApp {
public MergePhotosApp(){
// 1. load images 01.jpg, 02.jpg, ..., 05.jpg into a List
List<MarvinImage> images = new ArrayList<MarvinImage>();
for(int i=1; i<=5; i++){
images.add(MarvinImageIO.loadImage("./res/0"+i+".jpg"));
}
// 2. Load plug-in and process the image
MarvinImagePlugin merge = MarvinPluginLoader.loadImagePlugin("org.marvinproject.image.combine.mergePhotos");
merge.setAttribute("threshold", 38);
// 3. Process the image list and save the output
MarvinImage output = images.get(0).clone();
merge.process(images, output);
MarvinImageIO.saveImage(output, "./res/merge_output.jpg");
}
public static void main(String[] args) {
new MergePhotosApp();
}
}
Входные изображения и выходное изображение показаны ниже.
Проверьте принятый ответ здесь.
В приведенной выше ссылке происходит слияние двух изображений, которое выполняется openCV sdk.
Если вы не хотите использовать openCV и просто хотите попробовать себя, то вам придется немного поиграть с framlayout и с тремя изображениями. Дайте пользователю возможность выбрать конкретную часть изображения для показа для всех трех изображений. Таким образом, выбранная часть будет показана выбранного изображения. на этом пути вы получите результат, подобный тому, что вы сказали.
Надеюсь, вы поняли мою точку зрения. Если нет, то дайте мне знать.
Наслаждайтесь кодированием...:)
Я не знаю, будет ли это соответствовать вашему определению "нативные", но есть следующая библиотека.NET, которая может помочь: http://dynamicimage.apphb.com/
Если сама библиотека может дать вам желаемое, то в зависимости от вашей архитектуры вы можете настроить небольшой сайт ASP.NET для манипулирования изображениями на сервере.
Вы можете наложить изображения с помощью openCV, вы можете проверить на OpenCV и здесь или здесь
// Read the main background image
cv::Mat image= cv::imread("Background.png");
// Read the mans character image to be placed
cv::Mat character= cv::imread("character.png");
// define where you want to place the image
cv::Mat newImage;
//The 10,10 are the initial coordinates in pixels
newImage= image(cv::Rect(10,10,character.cols,character.rows));
// add it to the background, The 1 is the aplha values
cv::addWeighted(newImage,1,character,1,0,newImage);
// show result
cv::namedWindow("with character");
cv::imshow("with character",image);
//Write Image
cv::imwrite("output.png", newImage);
или вы можете создать его как эффект водяного знака
Или вы можете попробовать это в Java, как объединение двух изображений
попробуйте использовать этот класс
public class MergeImages {
public static void main(String[] args) {
File inner = new File("Inner.png");
File outter = new File("Outter.png");
try {
BufferedImage biInner = ImageIO.read(inner);
BufferedImage biOutter = ImageIO.read(outter);
System.out.println(biInner);
System.out.println(biOutter);
Graphics2D g = biOutter.createGraphics();
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f));
int x = (biOutter.getWidth() - biInner.getWidth()) / 2;
int y = (biOutter.getHeight() - biInner.getHeight()) / 2;
System.out.println(x + "x" + y);
g.drawImage(biInner, x, y, null);
g.dispose();
ImageIO.write(biOutter, "PNG", new File("Outter.png"));
} catch (Exception e) {
e.printStackTrace();
}
}
}