Java에서 두 개의 이미지 (BufferedImage)를 병합해야합니다. 투명성이 없다면 문제가되지 않을 것입니다. 기본 이미지에는 이미 투명도가 있습니다. 나는 이것을 그대로 유지하고 두 번째 이미지에 “마스크”를 적용하고 싶습니다. 이 두 번째 이미지에는 불투명 한 픽셀이 없습니다. 사실 거의 완전히 투명합니다. 반사와 같은 일종의 “빛 효과”를 제공하기 위해 약간의 덜 투명한 픽셀이 있습니다. 중요한 세부 사항 : 그래픽을 사용하여 화면에서이 작업을 수행하고 싶지 않습니다. 결과 병합으로 BufferedImage를 가져와야합니다.
누구든지 나를 도울 수 있습니까? 감사!
세부 정보 : 투명도를 유지하면서 두 이미지를 병합합니다. 이것이 내가해야 할 일입니다.
참고 : Java 의이 Set BufferedImage 알파 마스크는 투명성을 갖는 두 이미지를 잘 처리하지 못하기 때문에 필요한 작업을 수행하지 않습니다. 첫 번째 그림 투명도를 수정합니다.
답변
투명도가있는 새 BufferedImage를 만든 다음 다른 두 이미지 (전체 또는 반투명)를 그 위에 칠하면됩니다. 다음과 같이 표시됩니다.
샘플 코드 (이미지는 ‘image.png’및 ‘overlay.png’라고 함) :
File path = ... // base path of the images
// load source images
BufferedImage image = ImageIO.read(new File(path, "image.png"));
BufferedImage overlay = ImageIO.read(new File(path, "overlay.png"));
// create the new image, canvas size is the max. of both image sizes
int w = Math.max(image.getWidth(), overlay.getWidth());
int h = Math.max(image.getHeight(), overlay.getHeight());
BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
// paint both images, preserving the alpha channels
Graphics g = combined.getGraphics();
g.drawImage(image, 0, 0, null);
g.drawImage(overlay, 0, 0, null);
g.dispose();
// Save as new image
ImageIO.write(combined, "PNG", new File(path, "combined.png"));
답변
구체적인 답변을 드릴 수는 없지만 여기 java.awt.AlphaComposite가 친구입니다. 두 이미지를 병합하는 방법을 완전히 제어 할 수 있습니다. 그러나 사용하기가 간단하지 않습니다. 먼저 그래픽 이론을 약간 배워야합니다.
답변
달성하려는 효과에 대해 더 많이 알지 못하더라도 BufferedImage에 바로 그릴 수도 있음을 지적하겠습니다. 따라서 화면에서 할 수있는 모든 작업은 이미지 자체에서 바로 할 수 있습니다.
따라서 원하는 모든 것이 다른 하나 위에 그려져 있다면 정말 쉽습니다. 기본 이미지에 대한 Graphics 개체를 잡고 다른 이미지를 그 위에 그립니다.
다시 말하지만, 정확한 효과에 따라 작동하지 않을 수 있습니다. 더 자세한 정보는 더 나은 도움을 줄 것입니다. 예를 들어, 다른 응답자가 언급 한 AlphaComposite의 작업입니까, 아니면 사용자 지정 ImageOp (또는 기존 ImageOps의 일부 조합)입니까?
답변
모든 유형의 파일을 수직으로 병합합니다.
void mergeFiles(List<String> files, String fileName) {
int heightTotal = 0;
int maxWidth = 100;
List<BufferedImage> images = new ArrayList<>();
try {
for (String file : files) {
BufferedImage image = ImageIO.read(new File(file));
images.add(image);
}
for (BufferedImage bufferedImage : images) {
heightTotal += bufferedImage.getHeight();
if (bufferedImage.getWidth() > maxWidth) {
maxWidth = bufferedImage.getWidth();
}
}
int heightCurr = 0;
BufferedImage concatImage = new BufferedImage(maxWidth, heightTotal, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = concatImage.createGraphics();
for (BufferedImage bufferedImage : images) {
g2d.drawImage(bufferedImage, 0, heightCurr, null);
heightCurr += bufferedImage.getHeight();
}
File compressedImageFile = new File(fileName);
OutputStream outputStream = new FileOutputStream(compressedImageFile);
float imageQuality = 0.7f;
Iterator<ImageWriter> imageWriters = ImageIO.getImageWritersByFormatName("jpeg");
if (!imageWriters.hasNext())
throw new IllegalStateException("Writers Not Found!!");
ImageWriter imageWriter = imageWriters.next();
ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(outputStream);
imageWriter.setOutput(imageOutputStream);
ImageWriteParam imageWriteParam = imageWriter.getDefaultWriteParam();
//Set the compress quality metrics
imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
imageWriteParam.setCompressionQuality(imageQuality);
//Created image
imageWriter.write(null, new IIOImage(concatImage, null, null), imageWriteParam);
// close all streams
outputStream.close();
imageOutputStream.close();
imageWriter.dispose();
log.info(" Files Merged");
} catch (IOException e) {
log.error("Error while merging files :::"+e);
throw new RuntimeException(e);
}
}