두 이미지 병합


84

Java에서 두 개의 이미지 (BufferedImage)를 병합해야합니다. 투명성이 없다면 문제가되지 않을 것입니다. 기본 이미지에는 이미 투명도가 있습니다. 나는 이것을 그대로 유지하고 두 번째 이미지에 "마스크"를 적용하고 싶습니다. 이 두 번째 이미지에는 불투명 한 픽셀이 없습니다. 사실 거의 완전히 투명합니다. 반사와 같은 일종의 "빛 효과"를 제공하기 위해 약간의 덜 투명한 픽셀이 있습니다. 중요한 세부 사항 : 그래픽을 사용하여 화면에서이 작업을 수행하고 싶지 않습니다. 결과 병합으로 BufferedImage를 가져와야합니다.

누구든지 나를 도울 수 있습니까? 감사!

세부 정보 : 투명도를 유지하면서 두 이미지를 병합합니다. 이것이 내가해야 할 일입니다.

참고 : Java 의이 Set BufferedImage 알파 마스크는 투명성을 갖는 두 이미지를 잘 처리하지 못하기 때문에 필요한 작업을 수행하지 않습니다. 첫 번째 그림 투명도를 수정합니다.

답변:


179

투명도가있는 새 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"));

두 번째 이미지를 첫 번째 이미지의 중앙에 두는 방법이 있습니까?
Ahmed

6
g.dispose ();를 호출하면 안됩니다. 끝에?
m-szalik 2013-08-11

안녕, 난 단지 두 번째 이미지하지만 처음되지 이미지를 저장이 접근하고 따라 ... 여기에 어떤 도움을 주시면 감사하겠습니다 ..
TP_JAVA

@Peter 결합 된 파일을 jpeg 파일로 바로 잡으면 이미지가 회색으로 표시됩니다. 도와주세요
shebin 모하메드

3

구체적인 답변을 드릴 수는 없지만 여기 java.awt.AlphaComposite가 친구입니다. 두 이미지를 병합하는 방법을 완전히 제어 할 수 있습니다. 그러나 사용하기가 간단하지 않습니다. 먼저 그래픽 이론을 약간 배워야합니다.


3

달성하려는 효과에 대해 더 많이 알지 못하더라도 BufferedImage에 바로 그릴 수도 있음을 지적하겠습니다. 따라서 화면에서 할 수있는 모든 작업은 이미지 자체에서 바로 할 수 있습니다.

따라서 원하는 모든 것이 다른 하나 위에 그려져 있다면 정말 쉽습니다. 기본 이미지에 대한 Graphics 개체를 잡고 다른 이미지를 그 위에 그립니다.

다시 말하지만, 정확한 효과에 따라 작동하지 않을 수 있습니다. 더 자세한 정보는 더 나은 도움을 줄 것입니다. 예를 들어, 다른 응답자가 언급 한 AlphaComposite의 작업입니까, 아니면 사용자 지정 ImageOp (또는 기존 ImageOps의 일부 조합)입니까?


1

모든 유형의 파일을 수직으로 병합합니다.

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);
        }
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.