Heim >Java >javaLernprogramm >Java lädt Bilder, zeigt Bilder an und stellt Bilder in Graustufen dar
Das Java-Basispaket bietet Bildklassen, die wir häufig verwenden, darunter java.awt.image.BufferedImage, javax.imageio.ImageIO usw. Tatsächlich reichen diese beiden Klassen aus. Bei ersterem geht es um grundlegende Operationen an Bildern, bei letzterem geht es um das Lesen von Bildern.
Bild laden:
BufferedImage img = null; try{ img = ImageIO.read(new FileInputStream("/home/eple/DIP/o.jpg")); }catch (IOException e) { //e.printStackTrace(); }
Ich verwende Ubuntu, daher unterscheidet sich der Dateipfad geringfügig von dem von Windows.
Um den Code vielseitiger zu machen, habe ich eine neue Bildverarbeitungsklasse Imgae erstellt.
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; } }
Auf diese Weise verlassen wir uns nicht auf die von Java selbst bereitgestellten Methoden. Wir müssen nur das Bild in die von uns definierte Klasse konvertieren. In Android sind beispielsweise das Lesen und Überleben von Pixeln wie folgt: Ersetzen Sie einfach die entsprechenden Funktionen.
//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);
Okay, die obige Klasse enthält Methoden zum Lesen von Bildpixelinformationen und zum Speichern als int-Array und zum Konvertieren des int-Arrays in einen Bufferedmage. Als nächstes werden wir darüber sprechen, wie man Bilder entfärbt, also Graustufen.
Wie wir im vorherigen Artikel erwähnt haben, geht es uns bei der Bildverarbeitung mehr um die Helligkeitsinformationen des Bildes, also um die Graustufen. Wie konvertiert man ein Farbbild in ein Graustufenbild? Es ist ganz einfach: Machen Sie einfach die drei Werte von R, G und B gleich. Welche Beziehung besteht also zwischen diesem Wert und den ursprünglichen Werten von R, G und B?
Im Allgemeinen verwenden wir die empirische Formel Gray=R×0,299+G×0,587+B×0,114 oder nehmen einfach direkt ihren Durchschnittswert. Die bisherige empirische Formel stimmt eher mit der Beobachtung des menschlichen Auges überein. Die Graustufenfunktion lautet wie folgt:
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 } } } }
Der Verarbeitungseffekt ist wie folgt:
Das Obige ist Das Java-Ladebild, die Anzeige von Bildern und Graustufeninhalten finden Sie auf der chinesischen PHP-Website (www.php.cn).