Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.29 KB | None | 0 0
  1. import com.sun.imageio.plugins.jpeg.*;
  2. import com.sun.imageio.plugins.png.*;
  3. import javax.imageio.*;
  4. import javax.imageio.stream.*;
  5. import java.awt.image.BufferedImage;
  6. import java.io.*;
  7.  
  8. public class Main {
  9.     public static void main(String[] args) throws IOException {
  10.         CoolImage picture = new CoolImage(args[1]); // загружаем файл изображения
  11.         if ("-n".equals(args[0]))  picture.convertToNegative();
  12.         if ("-g".equals(args[0]))  picture.addColorGreenChannel(-100);
  13.         if ("-bw".equals(args[0])) picture.convertToBlackAndWhite();
  14.         picture.saveAsJpeg(args[2]);
  15.     }
  16.  
  17.     public static class CoolImage{
  18.         private int     height;             // высота изображения
  19.         private int     width;              // ширина изображения
  20.         private int[]   pixels;             // собственно массив цветов точек составляющих изображение
  21.  
  22.         public int getPixel(int x, int y)   { return pixels[y*width+x]; }   // получить пиксель в формате RGB
  23.         public int getRed(int color)        { return color >> 16; }         // получить красную составляющую цвета
  24.         public int getGreen(int color)      { return (color >> 8) & 0xFF; } // получить зеленую составляющую цвета
  25.         public int getBlue(int color)       { return color  & 0xFF;}        // получить синюю   составляющую цвета
  26.  
  27.         // Конструктор - создание изображения из файла
  28.         public CoolImage(String fileName) throws IOException {
  29.             BufferedImage img = readFromFile(fileName);
  30.             this.height = img.getHeight();
  31.             this.width  = img.getWidth();
  32.             this.pixels = copyFromBufferedImage(img);
  33.         }
  34.  
  35.         // Чтение изображения из файла в BufferedImage
  36.         private BufferedImage readFromFile(String fileName) throws IOException {
  37.             ImageReader     r  = new JPEGImageReader(new JPEGImageReaderSpi());
  38.             r.setInput(new FileImageInputStream(new File(fileName)));
  39.             BufferedImage  bi = r.read(0, new ImageReadParam());
  40.             ((FileImageInputStream) r.getInput()).close();
  41.             return bi;
  42.         }
  43.  
  44.         // Формирование BufferedImage из массива pixels
  45.         private BufferedImage copyToBufferedImage()  {
  46.             BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  47.             for (int i = 0; i < height; i++)
  48.                 for (int j = 0; j < width; j++)
  49.                     bi.setRGB(j, i, pixels[i*width +j]);
  50.             return bi;
  51.         }
  52.  
  53.         // Формирование массива пикселей из BufferedImage
  54.         private int[] copyFromBufferedImage(BufferedImage bi)  {
  55.             int[] pict = new int[height*width];
  56.             for (int i = 0; i < height; i++)
  57.                 for (int j = 0; j < width; j++)
  58.                     pict[i*width + j] = bi.getRGB(j, i) & 0xFFFFFF; // 0xFFFFFF: записываем только 3 младших байта RGB
  59.             return pict;
  60.         }
  61.  
  62.         // Запись изображения в jpeg-формате
  63.         public void saveAsJpeg(String fileName) throws IOException {
  64.             ImageWriter writer = new JPEGImageWriter(new JPEGImageWriterSpi());
  65.             saveToImageFile(writer, fileName);
  66.         }
  67.  
  68.         // Запись изображения в png-формате (другие графические форматы по аналогии)
  69.         public void saveAsPng(String fileName) throws IOException {
  70.             ImageWriter writer = new PNGImageWriter(new PNGImageWriterSpi());
  71.             saveToImageFile(writer, fileName);
  72.         }
  73.  
  74.         // Собственно запись файла (общая для всех форматов часть).
  75.         private void saveToImageFile(ImageWriter iw, String fileName) throws IOException {
  76.             iw.setOutput(new FileImageOutputStream(new File(fileName)));
  77.             iw.write(copyToBufferedImage());
  78.             ((FileImageOutputStream) iw.getOutput()).close();
  79.         }
  80.  
  81.         // конвертация изображения в негатив
  82.         public void  convertToNegative() {
  83.             for (int i = 0; i < height; i++)
  84.                 for (int j = 0; j < width; j++)
  85.                     // Применяем логическое отрицание и отбрасываем старший байт
  86.                     pixels[i*width + j] = ~pixels[i*width + j] & 0xFFFFFF;
  87.         }
  88.  
  89.         // конвертация изображения в черно-белый вид
  90.         public void convertToBlackAndWhite() {
  91.             for (int i = 0; i < height; i++)
  92.                 for (int j = 0; j < width; j++) {
  93.                     // находим среднюю арифметическую интенсивность пикселя по всем цветам
  94.                     int intens = (getRed(pixels[i * width + j]) +
  95.                             getGreen(pixels[i * width + j]) +
  96.                             getBlue(pixels[i * width + j])) / 3;
  97.                     // ... и записываем ее в каждый цвет за раз , сдвигая байты RGB на свои места
  98.                     pixels[i * width + j] = intens + (intens << 8) + (intens << 16);
  99.                 }
  100.         }
  101.  
  102.         // изменяем интесивность зеленого цвета
  103.         public void addColorGreenChannel(int delta) {
  104.             for (int i = 0; i < height; i++)
  105.                 for (int j = 0; j < width; j++) {
  106.                     int newGreen =  getGreen(pixels[i * width + j]) + delta;
  107.                     if (newGreen > 255) newGreen=255;  // Отсекаем при превышении границ байта
  108.                     if (newGreen < 0)   newGreen=0;
  109.                     // В итоговом пикселе R и B цвета оставляем без изменений: & 0xFF00FF
  110.                     // Полученный новый G (зеленый) засунем в "серединку" RGB: | (newGreen << 8)
  111.                     pixels[i * width + j] = pixels[i * width + j] & 0xFF00FF | (newGreen << 8);
  112.                 }
  113.         }
  114.     }
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement