package graphtest; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.ConvolveOp; import java.awt.image.Kernel; public class Panel extends JPanel { private BufferedImage bi; @Override // переозначення методу малювання public void paint (Graphics g) {// завантаження зображення super.paint(g); Graphics2D g2 = (Graphics2D) g; Image img = getToolkit().getImage("mashroom.jpg"); try { MediaTracker mt = new MediaTracker(this); mt.addImage(img, 0); mt.waitForID(0); // очікування завершення завантаження } catch(InterruptedException e) {} // задання розмірів створюваної області bi таких, // що збігаються з розмірами зображения img int bw = img.getWidth(this); int bh = img.getHeight(this); bi = new BufferedImage(bw,bh,BufferedImage.TYPE_INT_RGB); // створення графічного контексту big зображення bi Graphics2D big = bi.createGraphics(); // виведення зображення img у графічний контекст big big.drawImage(img, 0, 0, this); // визначення області збереження перетвореного зображення, // розміри якої збігаються з розмірами початкого зображення BufferedImage bimg0 = new BufferedImage (bw, bh, BufferedImage.TYPE_INT_RGB); BufferedImage bimg1 = new BufferedImage (bw, bh, BufferedImage.TYPE_INT_RGB); BufferedImage bimg2 = new BufferedImage (bw, bh, BufferedImage.TYPE_INT_RGB); BufferedImage bimg3 = new BufferedImage (bw, bh, BufferedImage.TYPE_INT_RGB); BufferedImage bimg4 = new BufferedImage (bw, bh, BufferedImage.TYPE_INT_RGB); // Усереднення у квадраті 3×3 int j; float [] w0 = {1, 1, 1, 1, 1, 1, 1, 1, 1}; for (j=0; j<9; j++) {w0[j]=w0[j]/9;} // Гаусове згладжування за матрицею 3×3 float [] w1 = {1, 2, 1, 2, 4, 2, 1, 2, 1}; for (j=0; j<9; j++) {w1[j]=w1[j]/16;} // Гаусове згладжування за матрицею 5×5 float [] w2 = {1, 4, 6, 4, 1, 4, 16, 24, 16, 4, 6, 24, 36, 24, 6, 4, 16, 24, 16, 4, 1, 4, 6, 4, 1}; for (j=0; j<25; j++) {w2[j]=w2[j]/256;} //Нерізкое маскування 5×5 На основі розмиття Гауса float [] w3 = {-1, -4, -6, -4,-1, -4,-16,-24,-16,-4, -6,-24,476,-24,-6, -4,-16,-24,-16,-4, -1, -4, -6, -4,-1}; for (j=0; j<25; j++) {w3[j]=w3[j]/256;} //Нерізкое маскування 5×5 На основі розмиття Гауса float [] w4 = {-1, -1, -1, -1, 8, -1, -1, -1, -1}; Kernel kern0 = new Kernel (3, 3, w0); Kernel kern1 = new Kernel (3, 3, w1); Kernel kern2 = new Kernel (5, 5, w2); Kernel kern3 = new Kernel (5, 5, w3); Kernel kern4 = new Kernel (3, 3, w4); ConvolveOp cop0 = new ConvolveOp (kern0, ConvolveOp.EDGE_NO_OP, null); ConvolveOp cop1 = new ConvolveOp (kern1, ConvolveOp.EDGE_NO_OP, null); ConvolveOp cop2 = new ConvolveOp (kern2, ConvolveOp.EDGE_NO_OP, null); ConvolveOp cop3 = new ConvolveOp (kern3, ConvolveOp.EDGE_NO_OP, null); ConvolveOp cop4 = new ConvolveOp (kern4, ConvolveOp.EDGE_NO_OP, null); cop0.filter (bi, bimg0); cop1.filter (bi, bimg1); cop2.filter (bi, bimg2); cop3.filter (bi, bimg3); cop4.filter (bi, bimg4); // верхній ряд зображень // виведення початкового зображенння g2.drawImage (bi, null, 10, 10); // виведення спотвореного зображенння g2.drawImage (bimg0, null, 260, 10); g2.drawImage (bimg1, null, 510, 10); // нижній ряд зображень g2.drawImage (bimg2, null, 10, 170); g2.drawImage (bimg3, null, 260, 170); g2.drawImage (bimg4, null, 510, 170); } }