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 } } } }
처리 효과는 다음과 같습니다.
위는 자바 로딩 이미지, 디스플레이 이미지 및 이미지의 회색조 콘텐츠에 대한 자세한 내용은 PHP 중국어 웹사이트(www.php.cn)를 참고하세요!