Привет блог. Сегодня будет маленькая заметка по работе с изображением. Скоро выйдет полноценная статья по пиксельному редактору. Итак, чтобы получить рандомное изображение с помощью 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 и конечно финальный эпизод — редактор пиксельных картинок.