본문 바로가기

JAVA환경에서 OpenCV없는 컬러영상처리

Java에서 FileDialog를 이용한 파일 입출력 함수

유튜브시연영상:https://youtu.be/xbaaB-DpQWs


//전역변수부
	int[][][] inImage;
	int inH,inW;
	int[][][] outImage;
	static int outH,outW;
	File inFp,outFp;
	float[] rgb = new float[3];
	float[] hsv = new float[3];
	float[] abc = new float[3];
	float[] def = new float[3];
	//Parameter Variable
	String algo, para1, para2;
	String inFname, outFname;
	BufferedImage bImage;

inputImage() 알고리즘

public void inputImage() {//선택한 이미지를 입력배열에 입력 받아 출력하는 함수
		try {
		//FileDialoge에서 열고자 하는 파일의 경로를 가져와 File클래스에 저장하는코드이다.
		//getDirectory()는 파일의 디렉터리 경로를 가져온다.
		//getFile()은 선택한 파일명을 가져온다.
		inFp =new File(fdlg1.getDirectory()+fdlg1.getFile());
		//File클래스에 저장한 경로에 따른 파일을 BufferedImage클래스에 저장한다.
		bImage = ImageIO.read(inFp);
		
		//BufferedImage에 저장된 그림은 가로 세로가 반대로 되어있다.
		//이렇게 반대로 하지않으면 배열 범위 초과 오류가 난다.
		inH = bImage.getWidth();
		inW = bImage.getHeight();
		
		inImage = new int[3][inH][inW];
		
		for(int i=0;i<inH;i++) {
			for(int k=0;k<inW;k++) {
				//BufferedImage에 저장된 이미지의 한 픽셀의 RGB값을 가져온다.
				//이 값은 0xf0ed77이런식으로 구성되어있다.
				int rgb=bImage.getRGB(i,k);
				
				//RGB값을 R값과 G값과 B값으로 나누어 변수에 값을 입력 받는다.
				int r =(rgb>>16)&0xFF;
				int g =(rgb>>8)&0xFF;
				int b=(rgb>>0)&0xFF;
				
				//RGB값을 입력 배열에 입력
				inImage[0][i][k]=r;
				inImage[1][i][k]=g;
				inImage[2][i][k]=b;
				
				//사진 출력을 위해 다시 버퍼에 입력한다.
				//이 번거로운 과정을 거치는 이유는 drawImage가 배열을 받아 그리지 못하고
				//버퍼에 입력된 이미지를 그릴 수 있기 때문이다.
				bImage.setRGB(i, k, rgb);
			}
		}
		//repaint()를 통해 버퍼에 입력된 이미지를 출력한다.
		repaint();
		
		}catch(Exception e){
			System.out.println("BBBBB255줄"+e);
		}
		
		
	}

paintComponent()

class MyPanel extends JPanel{//패널을 상속받은 클래스를 만들어 paintComponent()함수를 추가한다.
		//repaint()하면 이 함수가 호출되는 것이다.
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			//버퍼에 있는 이미지를 출력함
			g.drawImage(bImage,50,100, this);
		}
	}

displayImage() 알고리즘

public void displayImage() {//영상처리한 이미지를 출력하는 함수 
		try {
			
			for(int i=0;i<outH;i++) {
				for(int k=0;k<outW;k++) {
					//outImage에 들어있는 픽셀값을 잘 R,G,B를 나눠서 넣는다.
					int r = outImage[0][i][k];
					int g = outImage[1][i][k];
					int b = outImage[2][i][k];
					//RGB픽셀값들을 합쳐서 하나로 만든 값을 저장할 변수
					int px=0;
					px=px|(r<<16);
					px=px|(g<<8);
					px=px|(b<<0);
					//다시 0xff08e6같은 수로 변하고 이미지를 저장할 버퍼에 넣는다.
					bImage.setRGB(i, k, px);
				}
			}

			//다시 그림
			repaint();
			
			}catch(Exception e){
				System.out.println("kkkkkkk321줄"+e);
			}
	}

outputImage()

public void outputImage() {//영상처리한 이미지를 원하는 위치에 저장하는 함수
		try {
			//이미지를 위치에 저장한다. 그냥 저장하면  확장자없는 파일로 나오기 때문에 저장시의 확장자를 임의로 jpg로 맞춰준다.
			outFp=new File(fdlg2.getDirectory()+fdlg2.getFile()+".jpg");
			//RGB값을 입력받을 버퍼라는 의미(BufferedImage.TYPE_INT_RGB)
			BufferedImage oImage = new BufferedImage(outH,outW,BufferedImage.TYPE_INT_RGB);
			for(int i=0;i<outH;i++) {
				for(int k=0;k<outW;k++) {
					//저장하고 싶은 이미지의 배열을 rgb에 저장한다.
					int r = outImage[0][i][k];
					int g = outImage[1][i][k];
					int b = outImage[2][i][k];
					//픽셀을 하나로 합친다.
					int px=0;
					px=px|(r<<16);
					px=px|(g<<8);
					px=px|(b<<0);
					//출력할 버퍼에 픽셀값 하나를 넣는다.
					oImage.setRGB(i, k, px);
				}
			}
			//버퍼에 담긴 이미지를 jpg형식으로 선택한 파일 위치에 저장한다.
			ImageIO.write(oImage,"jpg",outFp);
		}catch(Exception e) {
			System.out.println("CCCCCC245"+e);
		}
	}