> Java > java지도 시간 > 본문

Java는 이미지를 로드하고 이미지와 회색조 이미지를 표시합니다.

黄舟
풀어 주다: 2016-12-30 11:58:35
원래의
1624명이 탐색했습니다.

Java 기본 패키지는 우리가 일반적으로 사용하는 이미지 클래스를 제공합니다. 여기에는 java.awt.image.BufferedImage, javax.imageio.ImageIO 등이 포함됩니다. 실제로 이 두 클래스로 충분합니다. 전자는 이미지에 대한 기본적인 작업에 관한 것이고, 후자는 이미지를 읽는 것에 관한 것입니다.

이미지 불러오기:

      BufferedImage img = null;  
        try{  
            img = ImageIO.read(new FileInputStream("/home/eple/DIP/o.jpg"));  
          
        }catch (IOException e) {  
            //e.printStackTrace();  
        }
로그인 후 복사

우분투 환경에서 실행중이라 파일 경로가 윈도우와 조금 다릅니다.

코드를 더욱 다양하게 만들기 위해 이미지 처리 클래스인 이미지개를 새로 만들었습니다.

public class Image{
	
	public int h; //高
	public int w; //宽
	public int[] data; //像素
	public boolean gray; //是否为灰度图像
	
	public Image(BufferedImage img){
		
		this.h = img.getHeight();
		this.w = img.getWidth();
		
		this.data = img.getRGB(0, 0, w, h, null, 0, w);
		this.gray = false;
		toGray(); //灰度化
	}
	
	public Image(BufferedImage img,int gray){
		
		this.h = img.getHeight();
		this.w = img.getWidth();
		this.data = img.getRGB(0, 0, w, h, null, 0, w);
		this.gray = false;

	}

	public Image(int[] data,int h,int w){
		this.data = (data == null) ? new int[w*h]:data;
		this.h = h;
		this.w = w;
		this.gray = false;
	}
	
	public Image(int h,int w){
		this(null,h,w);
	}

        public BufferedImage toImage(){
               BufferedImage image = new BufferedImage(this.w, this.h, BufferedImage.TYPE_INT_ARGB);
               int[] d= new int[w*h];
               for(int i=0;i<this.h;i++){
               for(int j=0;j<this.w;j++){
                   if(this.gray){
                       d[j+i*this.w] = (255<<24)|(data[j+i*this.w]<<16)|(data[j+i*this.w]<<8)|(data[j+i*this.w]);
                   }else{
                       d[j+i*this.w] = data[j+i*this.w];
                   }
               }
         }
            image.setRGB( 0, 0, w, h, d, 0, w ); 
            return image;
     }

}
로그인 후 복사

이렇게 하면 Java 자체에서 제공하는 메소드에 의존하지 않고 이미지를 우리가 정의한 클래스로 변환하기만 하면 됩니다. 예를 들어 Android에서는 픽셀 읽기 및 생존이 다음과 같으며 관련 기능을 대체하면 됩니다.

 //android 中的获取方式RGB分量    
   pixelsA = Color.alpha(color);    
   pixelsR = Color.red(color);    
   pixelsG = Color.green(color);    
   pixelsB = Color.blue(color);  
                      
 // 根据新的RGB生成新像素    
   newPixels[i] = Color.argb(pixelsA, pixelsR, pixelsG, pixelsB);
로그인 후 복사


위 클래스에는 이미지 픽셀 정보를 읽고 이를 int 배열로 저장하고 int 배열을 Bufferedmage로 변환하는 메서드가 포함되어 있습니다. 다음으로 이미지, 즉 그레이 스케일을 탈색하는 방법에 대해 이야기하겠습니다.

이전 기사에서 언급했듯이 이미지 처리에 관해서는 이미지의 밝기 정보, 즉 그레이 스케일에 더 관심이 있습니다. 컬러 이미지를 그레이 스케일 이미지로 변환하는 방법은 무엇입니까? 아주 간단합니다. R, G, B 세 값을 동일하게 만들면 됩니다. 그렇다면 이 값과 R, G, B의 원래 값 사이에는 어떤 관계가 있을까요?

일반적으로 실험식 Gray=R×0.299+G×0.587+B×0.114를 사용하거나 평균값을 직접 취합니다. 이전의 경험식은 인간의 눈으로 관찰한 것과 더 일치합니다. Grayscale 함수는 다음과 같습니다.

public void toGray(){  
          
        if(!gray){  
            this.gray = true;  
            for (int y = 0; y < h; y++) {  
                       for (int x = 0; x < w; x++) {  
                          int c = this.data[x + y * w];  
                          int R = (c >> 16) & 0xFF;  
                          int G = (c >> 8) & 0xFF;  
                          int B = (c >> 0) & 0xFF;  
                          this.data[x + y * w] = (int)(0.3f*R + 0.59f*G + 0.11f*B); //to gray  
                }  
              }  
        }  
    }
로그인 후 복사

처리 효과는 다음과 같습니다.

Java는 이미지를 로드하고 이미지와 회색조 이미지를 표시합니다.

Java는 이미지를 로드하고 이미지와 회색조 이미지를 표시합니다.

위는 자바 로딩 이미지, 디스플레이 이미지 및 이미지의 회색조 콘텐츠에 대한 자세한 내용은 PHP 중국어 웹사이트(www.php.cn)를 참고하세요!


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿