Как сделать арифметические c операции над пикселями в Java - PullRequest
0 голосов
/ 29 апреля 2020

Я должен добавить некоторое постоянное значение ко всем пикселям в моем изображении - для серого и цветного изображения. Но я не знаю, как я могу это сделать. Я читаю изображение с помощью BufferedImage, и я пытаюсь получить 2d массив пикселей. Я нашел что-то вроде BufferedImage.getRGB (), но он возвращает странные значения (отрицательные и огромные). Как добавить какое-то значение моему буферизованному изображению?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Чтобы добавить постоянное значение ко всем пикселям, вы можете использовать RescaleOp . Ваша константа будет offset для каждого канала. Оставьте scale в 1.0, а hints может быть null.

// Positive offset makes the image brighter, negative values makes it darker
int offset = 100; // ...or whatever your constant value is
BufferedImage brighter = new RescaleOp(1, offset, null)
                                 .filter(image, null);

Чтобы изменить текущее изображение, вместо создания нового, вы можете использовать:

new RescaleOp(1, offset, null)
        .filter(image, image);
0 голосов
/ 29 апреля 2020

Вы можете использовать:

byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();

Чтобы получить byte[] всех пикселей на изображении, а затем l oop над byte[], добавляя вашу константу к каждому элементу байта.

Если вы хотите, чтобы байты были преобразованы в двумерный байт [], я нашел пример, который делает именно это ( Получить двумерный пиксельный массив ).

В итоге код выглядит так:

private static int[][] convertToArrayLocation(BufferedImage inputImage) {
   final byte[] pixels = ((DataBufferByte) inputImage.getRaster().getDataBuffer()).getData(); // get pixel value as single array from buffered Image
   final int width = inputImage.getWidth(); //get image width value
   final int height = inputImage.getHeight(); //get image height value
   int[][] result = new int[height][width]; //Initialize the array with height and width

    //this loop allocates pixels value to two dimensional array
    for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel++) {
       int argb = 0;
       argb = (int) pixels[pixel];

       if (argb < 0) { //if pixel value is negative, change to positive 
          argb += 256;
       }

       result[row][col] = argb;
       col++;

       if (col == width) {
          col = 0;
          row++;
       }
   }

   return result; //return the result as two dimensional array
} //!end of method!//
...