funkcionálně.cz

Přední český blog o funkcionálním programování, kde se o funkcionálním programování nepíše

Jak v Javě na náhledy obrázků, ze kterých si lidé nebudu chtít vydloubat oči a prázdné oční důlky vypláchnout kyselinou

25. 3. 2017

Jedna rychlovka, která je spíš poznámkou pro mě v budoucnosti než pro kohokoli jiného: Funkcionalita ve standardní knihovně v Javy není příliš dobrá pro vytváření náhledů obrázků. Zmenšený obrázek má výrazný aliasing.

To se dá jednoduše obejít tím, že obrázek napřed rozmažu a pak teprve zmenším. Výsledek není perfektní, ale aspoň není tak zubatý a hlavně: jde jen o minimální změnu.

def resizeImage(src: BufferedImage, width: Int, height: Int) = {
  val blur = new ConvolveOp(
    new Kernel(5, 5, Array.fill[Float](25)(1f/25)),
    ConvolveOp.EDGE_NO_OP, null
  )

  val zoom = math.min(1.0 * src.getWidth / width, 1.0 * src.getHeight / height)
  val wz = (width * zoom).toInt
  val hz = (height * zoom).toInt
  val x = (src.getWidth - wz) / 2
  val y = (src.getHeight - hz) / 2

  val crop = blur.filter(src.getSubimage(x, y, wz, hz), null)

  val tpe = if (crop.getType == BufferedImage.TYPE_CUSTOM) BufferedImage.TYPE_INT_ARGB else crop.getType
  val thumb = new BufferedImage(width, height, tpe)
  val g = thumb.createGraphics()
  g.drawImage(crop, 0, 0, width, height, null)
  g.dispose()

  thumb
}
@kaja47, kaja47@k47.cz, deadbeef.k47.cz, starší články