BufferedImage — рисуем рандомное изображение

Привет блог. Сегодня будет маленькая заметка по работе с изображением. Скоро выйдет полноценная статья по пиксельному редактору. Итак, чтобы получить рандомное изображение с помощью BufferedImage возьмем пару функций из заметки BufferedImage — рисуем пиксельное сердце.

Нам пригодятся — drawPixel() и writeImage()

fun drawPixel(x:Int, y:Int, red:Int, green:Int, blue: Int, image: BufferedImage) {     
    image.setRGB(x, y, Color(red,green,blue).rgb) 
}
fun writeImage(img: BufferedImage, file: String) {     
    val imagethread = Thread(Runnable {             
        ImageIO.write(img, File(file).extension, File(file))
    })     
    try {         
        imagethread.start()     
    } catch (ex: Exception) {         
        ex.printStackTrace()         
        imagethread.interrupt()     
    } 
}

Первая рисует пиксель с заданным цветом и координатами на картинке, а вторая — записывает изображение. Отлично. Теперь самое главное — метод, который будет рисовать рандомное изображение в BufferedImage.

fun drawRandImage(img: BufferedImage, stepSize: Int = 1, redRng: Int = 255, greenRng: Int = 255, blueRng: Int = 255) {
    for(posX in 0 until image.width step stepSize){
        for (posY in 0 until image.height step stepSize) {
            val r = if (redRng <=0) 0 else Random.nextInt(0, redRng)
            val g = if (greenRng <=0) 0 else Random.nextInt(0, greenRng)
            val b = if (blueRng <=0) 0 else Random.nextInt(0, blueRng)

            drawPixel(posX, posY, r, g, b, img)
        }
    }
}

В коде выше, мы принимает на вход:

  • переменную img, в которую и будем соответственно производить запись
  • stepSize — размер шага для отрисовки (с помощью него можно получить интересный эффект)
  • redRng, greenRng, blueRng — уровни цвета каждого канала, задав которые можно добавить или убавить определенный цвет.

В теле метода мы просто проходимся по координатам (posX : posY) и рисуем наш random pixel при помощи drawPixel. Все, на этом можно в принципе заканчивать. Осталось показать примеры работы функции.

val imageRand = BufferedImage(380,380, TYPE_INT_RGB)

drawRandImage(imageRand) // рандомное изображение
writeImage(imageRand,"D:/imageRand.bmp")

drawRandImage(imageRand,3,10,240,230) // делаем step 3 и убавляем красный
writeImage(imageRand,"D:/imageRand2.bmp")

drawRandImage(imageRand,2,180,20,230) // убавляем чуть красный и шаг 2
writeImage(imageRand,"D:/imageRand3.bmp")

Также, переписав немного метод можно получить изображение RGB сетки пикселей монитора. А накидав функцию-расширение для класса, можно получить черно-белую картинку.

fun BufferedImage.desaturate(): BufferedImage {
    val colorConvert = ColorConvertOp (ColorSpace.getInstance(ColorSpace.CS_GRAY), null)
    return colorConvert.filter(this, this)
}

imageRand.desaturate()
writeImage(imageRand,"D:/imageRand4.bmp")

Ну вот и все. В скором времени выйдет статься по работе с Apache POI — библиотекой для взаимодействия с Word, Excel, PDF и конечно финальный эпизод — редактор пиксельных картинок.

Оставить ответ