자바 에서 이미지 예화 작업 방법 에 대한 상세 한 설명

5953 단어 자바이미지예화
1.이 이미지 의 예리 한 사상:
본 논문 의 이미지 예화 란 이미지 에 있 는 R,G,B 의 값 을 각각 원 이미지 에서 제시 한 다음 에 이 세 개의 R,G,B 의 값 을 각각 볼 륨 핵 과 볼 륨 을 한 다음 에 마지막 세 개의 볼 륨 결 과 를 하나의 픽 셀 값 으로 합성 하여 이미지 의 예화 효 과 를 실현 하 는 것 이다.
2.전체적인 이미지 예화 코드 는 다음 과 같 습 니 다.

package com.yf1105;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class ImageTest extends JFrame{
	
	public static void main(String[] args) {
		new ImageTest();
	}
	public ImageTest() {
		
		setSize(1000,700);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
	}
	
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		int[][] rgbOfImg = getImagePixel("image/3.jpg");
		test(g, "  ",rgbOfImg.length, rgbOfImg[0].length, rgbOfImg);
//		g.drawImage(new ImageIcon("img/hk.jpg").getImage(), 0, 0, null);
	}
	
	
	public void test(Graphics graphics,String text,int width,int height,int[][] rgbOfImg) {
		int[][] R ,G ,B;
		int size=3;
		//                
//		if(text.equals("  ")){size = 5;}	
		//     
		double[][] sharpening = {{-1,-1,-1},{-1,9,-1},{-1,-1,-1}};
//		float[][] sharpening = { { -1, -1, -1, -1, -1 }, { -1, -1, -1, -1, -1 }, { -1, -1, 25, -1, -1 },
//				{ -1, -1, -1, -1, -1 }, { -1, -1, -1, -1, -1 } };
		//         
		//   rgb  
		R = new int[size][size];
		G = new int[size][size];
		B = new int[size][size];
		//  3*3           
		for(int x = 0;x < width-size+1;x++){
			for(int y = 0;y < height-size+1;y++){
			//         r,g,b    ,             0,           
				int resultOfR = 0;
				int resultOfG = 0;
				int resultOfB = 0;
				//    rgb    ,         
				for(int j = 0;j <size;j++){
					for(int i = 0;i < size;i++){
						//    RGB    ,        
						int argb = rgbOfImg[x][y];
						
						//     R,G,B  
						//int   4 32  ,0      (A),1   R ,2   G ,3   B 
						//>>  :          ,          ,   0,   1,           
						//&:        ,           1      1,0xff    1      (11111111),     0xff            
						//                     ,        32    8  
						R[i][j] = argb>>16 & 0xff;
						G[i][j] = argb>>8 & 0xff;
						B[i][j] = argb  & 0xff;
					}
				}
				if(text.equals("  ")){
					//   R,G,B      ,        
					for(int j = 0;j < size;j++){
						for(int i = 0;i < size;i++){
							resultOfR += (int)(sharpening[i][j]*R[i][j]);
						}	
					}
					for(int i = 0;i < size;i++){
						for(int j = 0;j < size;j++){
							resultOfG += (int)(sharpening[i][j]*G[i][j]);
		
						}
					}				
					for(int i = 0;i < size;i++){
						for(int j = 0;j < size;j++){
							resultOfB += (int)(sharpening[i][j]*B[i][j]);
						}
					}
				}
				//     rgb   (0-255),             
				if(resultOfR > 255)resultOfR = 255;
				if(resultOfR < 0)resultOfR = 0;
				if(resultOfG > 255)resultOfG = 255;
				if(resultOfG < 0)resultOfG = 0;
				if(resultOfB > 255)resultOfB = 255;
				if(resultOfB < 0)resultOfB = 0;
				//   rgb       
				Color color = new Color(resultOfR, resultOfG, resultOfB);
				//    ,  graphics      ( BufferedImage  Graphics )
				graphics.setColor(color);
				//    (drawline    ,             ,          )
				//size/2            
				graphics.drawLine(x+size/2, y+size/2, x+size/2, y+size/2);
				}
		}

	}
	
	//            
		public int[][] getImagePixel(String image) {
			BufferedImage bi = null;
			File file = new File(image);

			try {
				bi = ImageIO.read(file);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			int w = bi.getWidth();
			int h = bi.getHeight();
			int imgindex[][] = new int[w][h];

			for (int i = 0; i < w; i++) {
				for (int j = 0; j < h; j++) {
					int rgb = bi.getRGB(i, j);
					imgindex[i][j] = rgb;
					System.out.print(" " + rgb);
				}
				System.out.println();
			}
			return imgindex;

		}
}
출력 결과:

원본 그림 과 의 차 이 는 크 지 않 지만 볼 륨 핵 선택 때 문 일 수 있 습 니 다.
3.핵심 코드 의 해석

이 세그먼트 코드 는 RGB 이미지 의 R,G,B 값 을 추출 한 다음 에 각각 R,G,B 값 을 볼 륨 작업 한 다음 에 볼 륨 된 결 과 를 int 의 픽 셀 값 으로 재 통합 하여 이미지 의 예화 처 리 를 실현 합 니 다.
당시 에 이 코드 를 보 았 을 때 이 부분 은 잘 모 르 는 것 을 발 견 했 습 니 다.코드 는 다음 과 같 습 니 다.

R[i][j] = argb>>16 & 0xff;
G[i][j] = argb>>8 & 0xff;
B[i][j] = argb  & 0xff;
그러나 하위 연산 과 연산 을 자세히 분석 한 결과 이 코드 는 R,G,B 의 값 을 각각 추출 하 는 것 을 발견 했다.int 류 의 픽 셀 값 에는 a,r,g,b 네 개의 값 이 포함 되 어 있 고 int 는 32 비트 이 며 이 네 개의 수 는 순서대로 int 에 존재 하고 각 수 는 8 위 를 차지 하기 때문이다.따라서 r 는 2 진법 에 대해 16 비트 를 이동 해 야 oxff(즉 1111 1111)와 연산 할 수 있 습 니 다.b 는 2 진법 에 대해 8 비트 를 이동 해 야 oxff(즉 1111 1111)와 연산 할 수 있 습 니 다.g 는 직접 oxff(즉 1111 1111)와 연산 하면 됩 니 다.이렇게 표현 하 는 것 이 이해 하기 어렵 지만 아래 의 설명도 를 보 세 요.

총결산
자바 의 이미지 예화 작업 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 이미지 예화 작업 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기