ホームページ  >  記事  >  Java  >  Javaは画像をロードし、画像を表示し、画像をグレースケールします

Javaは画像をロードし、画像を表示し、画像をグレースケールします

黄舟
黄舟オリジナル
2016-12-30 11:58:351623ブラウズ

Java 基本パッケージには画像クラスが用意されており、一般的に使用されるクラスには java.awt.image.BufferedImage、javax.imageio.ImageIO などが含まれます。実際には、これら 2 つのクラスで十分です。前者は画像に対する基本的な操作について、後者は画像の読み取りについて説明します。

画像の読み込み:

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

私はubuntuで実行しているため、ファイルパスはWindowsのものとは少し異なります。

コードの汎用性を高めるために、新しい画像処理クラス Imgae を作成しました。

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の3つの値を同じにするだけです。では、この値と R、G、B の元の値との間にはどのような関係があるのでしょうか?

一般に、Gray=R×0.299+G×0.587+B×0.114という経験式があるか、単にそれらの平均値を直接取得します。前述の経験式は、人間の目の観察とより一致しています。グレースケール関数は次のとおりです:

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は画像をロードし、画像を表示し、画像をグレースケールします

上記は、画像のグレースケール コンテンツと画像を表示する Java ローディング画像です。その他の関連コンテンツについては、こちらをご覧ください。 PHP 中国語 Web サイト (www.php.cn) に注意してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。