[자바]특정 이미지에 투명도 입히기

2022. 4. 11. 01:15프로그래밍

728x90

내가 생각해도 약간 말이 안되게 이리저리 스택오버플로우에서 받아다가 쓴 것 같은 글입니다.

https://blog.naver.com/tommybee/50144474479

 

About Transparent Image extracting specific value - java

Remove specific pixel value for transparent image in java 특정 값을 뺀 투명이미지 만들기 private I...

blog.naver.com

이해도 안되고 해서 다시 한 번 만들어 볼까 합니다. 물론 스택오버플로우에 있는 소스 코드를 그대로 가져다 쓰도록 하겠습니다.

package com.tobee.test.image;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.awt.image.ImageProducer;
import java.awt.image.RGBImageFilter;
import java.io.*;

import javax.imageio.ImageIO;

public class AddTransparency {
	
	private static BufferedImage imageToBufferedImage(Image image) {

		BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null),
				BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2 = bufferedImage.createGraphics();
		g2.drawImage(image, 0, 0, null);
		g2.dispose();

		return bufferedImage;

	}

	public static Image makeColorTransparent(BufferedImage im, final Color color) {
		ImageFilter filter = new RGBImageFilter() {

			// the color we are looking for... Alpha bits are set to opaque
			public int markerRGB = color.getRGB() | 0xFF000000;

			public final int filterRGB(int x, int y, int rgb) {
				if ((rgb | 0xFF000000) == markerRGB) {
					// Mark the alpha bits as zero - transparent
					return 0x00FFFFFF & rgb;
				} else {
					// nothing to do
					return rgb;
				}
			}
		};

		ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
		return Toolkit.getDefaultToolkit().createImage(ip);
	}

	public static void main(String[] args) throws IOException {
    	String imagePath = "./images/";
		File inFile = new File(imagePath, "1005214200.jpg");
		BufferedImage source = ImageIO.read(inFile);

        int color = 0xffffff;

        Image image2 = makeColorTransparent(source, new Color(color));

        BufferedImage transparent = imageToBufferedImage(image2);

        File out = new File(imagePath, "trans.PNG");
        ImageIO.write(transparent, "PNG", out);
	}
}

구글링해서 아무 이미지를 하나 다운로드 받았습니다. 나는 'question' 으로 해서 다음의 이미지를 다운 받았습니다.

위의 이미지는 눈으로 봐도 흰색 부분에 투명도가 더 해 지면 가장 이상적일 것 같네요

그래서 흰색 이미지 픽셀 부분만 투명도를 더해 주도록 합니다.

물론 전체 코드 상에서 다음과 같이 이미 적용 되어 있는 부분이기도 합니다.

int color = 0xffffff;
Image image2 = makeColorTransparent(source, new Color(color));

이렇게 이미지를 변환하게 되면, 다음과 같이 흰색과 흰색 경계의 이미지는 투명도가 적용되지 않는 약간 거친 투명 이미지가 생성 되는 것을 알 수 있습니다.

사람의 눈으로 수작없을 진행 해야 할 정도의 이미지이기는 한데요. 약간의 아이디어가 필요 할 것 같습니다.

 

이상.

728x90

'프로그래밍' 카테고리의 다른 글

Guice - Google  (2) 2022.08.30
DisconnectedContext 오류  (0) 2022.04.28
[자바] Argument Parser  (0) 2022.04.10
자바에서 enum 사용  (0) 2022.04.10
자바, C++ enum  (0) 2022.04.10