Codetown ::: a software developer's community
Welcome to Kotlin Thursdays! Last week, we were able to render an image with TornadoFX and even manipulate its pixels. Today, we will go over Pixel Math!
Think of these resources as supplemental if you happen to be more curious. We always encourage looking into documentation for things you use!
Last week, we got the hang of how to grab these pixels and do something with them. Today, we're going to expand by creating our own filters using operational pixel manipulation.
For all practical purposes, we're going to be talking about monochromatic images. If we try to write filters using colored pixels, it will prove a lot more difficult to work with RGB values as opposed to just black or white.
Best we learn to walk before we start trying to fly!
In order to create our own image filters, we need to have a solid understanding of pixel math, or binary operations.
Binary operations are the bread and butter of computers! You can compute operations on binary values 1 and 0.
AND - both inputs must be true for the output to be true
0 && 0 = 0
0 && 1 = 0
1 && 0 = 0
1 && 1 = 1
OR - one or both inputs must be true for the output to be true
0 || 0 = 0
0 || 1 = 1
1 || 0 = 1
1 || 1 = 1
NOT - inverse result
!0 = 1
!1 = 0
!(0 && 0) = 1
!(1 || 1) = 0
Likewise, if we assign the color BLACK to 1 and the color WHITE to 0, we can easily apply binary operations to to the binary values black and white. Working with colors gets significantly more difficult when there are RGB values to consider. There are other binary operations like XANDS, XORS, and XNORS, but for now, let's just focus on the first three.
Now that we understand how OR, AND, and NOT works, let's implement these functions with colors.
fun or (a: Color, b: Color) {
return if (a == Color.BLACK || b == Color.BLACK) {
Color.BLACK
}
else { Color.WHITE
}
fun and (a: Color, b: Color) {
return if (a == Color.BLACK && b == Color.BLACK) {
Color.BLACK
} else {
Color.WHITE
}
}
fun not (color: Color) {
return if (color == Color.BLACK) Color.WHITE else Color.BLACK
}
You'll notice that these functions are for pixel colors only. Next week, we look into higher-order functions in Kotlin to learn how we can pass functions as a parameter - but you'll welcome to check out the video to see how we can apply one of these primitive filters to our images! See you next week :)
Tags:
Codetown is a social network. It's got blogs, forums, groups, personal pages and more! You might think of Codetown as a funky camper van with lots of compartments for your stuff and a great multimedia system, too! Best of all, Codetown has room for all of your friends.
Created by Michael Levin Dec 18, 2008 at 6:56pm. Last updated by Michael Levin May 4, 2018.
Check out the Codetown Jobs group.

CameraX 1.5 introduces support for capturing slow-motion and high frame-rate videos as well as unprocessed, uncompressed still images. These capabilities are enabled by the new SessionConfig API, which streamlines camera setup and configuration.
By Sergio De Simone
At QCon SF 2025, Dr. Nicole Forsgren highlighted how AI accelerates code generation but reveals deployment bottlenecks, urging a strategic pivot to optimizing Developer Experience (DevEx). With 31% of developer time lost to friction, focusing on effective feedback loops, flow state, and cognitive load management is vital for competitive survival and retention.
By Steef-Jan Wiggers
IBM recently announced the Granite 4.0 family of small language models. The model family aims to deliver faster speeds and significantly lower operational costs at acceptable accuracy vs. larger models. Granite 4.0 features a new hybrid Mamba/transformer architecture that largely reduces memory requirements, enabling Granite to run on significantly cheaper GPUs and at significantly reduced costs.
By Bruno Couriol
This week's Java roundup for November 10th, 2025, features news highlighting: OpenJDK JEPs targeted for JDK 26; the GA release of Spring Framework 7.0; point releases of Spring Data, Spring AI, JobRunr and Jox; the November 2025 edition of Payara Platform; the fifth release candidate of Maven 4.0; and a maintenance release of Micronaut.
By Michael Redlich
Generative AI technologies need to support new workloads, traffic patterns, and infrastructure demands and require a new set of tools for the age of GenAI. Erica Hughberg from Tetrate and Alexa Griffith from Bloomberg spoke last week at KubeCon + CloudNativeCon North America 2025 Conference about what it takes to build GenAI platforms capable of serving model inference at scale.
By Srini Penchikala
© 2025 Created by Michael Levin.
Powered by