[orx-image-fit] Add imageFitSub function

Introduce the `imageFitSub` function, enabling subsections of images to be drawn with fit and alignment capabilities. Added a demo showcasing its usage with grid-based rendering and updated dependencies with `orx-noise` for randomness support.
This commit is contained in:
Edwin Jakobs
2025-02-26 21:28:54 +01:00
parent 660949271d
commit acf1c33c5e
3 changed files with 61 additions and 0 deletions

View File

@@ -21,6 +21,7 @@ kotlin {
dependencies {
implementation(project(":orx-shapes"))
implementation(project(":orx-image-fit"))
implementation(project(":orx-noise"))
}
}
}

View File

@@ -153,3 +153,35 @@ fun Drawer.imageFit(
image(img, source, target)
return Pair(source, target)
}
/**
* Draws a subsection of the given image into a target rectangle within the current `Drawer` bounds,
* using the specified fit method and alignment.
*
* @param img The `ColorBuffer` representing the image to draw.
* @param source The subsection of the image to be fitted, defined as a `Rectangle`. Defaults to the full bounds of the image.
* @param target The rectangle within the `Drawer` bounds where the image will be drawn. Defaults to the full bounds of the `Drawer`.
* @param horizontalPosition Horizontal alignment or cropping position for the image as a normalized value from -1.0 to 1.0.
* @param verticalPosition Vertical alignment or cropping position for the image as a normalized value from -1.0 to 1.0.
* @param fitMethod The method to use for fitting the image into the target rectangle. Defaults to `FitMethod.Cover`.
* @return A `Pair` of `Rectangle` objects, where the first element is the transformed source rectangle, and the second element is the target rectangle.
*/
fun Drawer.imageFitSub(
img: ColorBuffer,
source: Rectangle = img.bounds,
target: Rectangle = this.bounds,
horizontalPosition: Double = 0.0,
verticalPosition: Double = 0.0,
fitMethod: FitMethod = FitMethod.Cover
): Pair<Rectangle, Rectangle> {
val (fitSource, fitTarget) = fitRectangle(
source,
target,
horizontalPosition,
verticalPosition,
fitMethod
)
image(img, fitSource, fitTarget)
return Pair(source, target)
}

View File

@@ -0,0 +1,28 @@
import org.openrndr.application
import org.openrndr.draw.loadImage
import org.openrndr.extra.imageFit.imageFitSub
import org.openrndr.extra.noise.shapes.uniformSub
import org.openrndr.extra.shapes.primitives.grid
import kotlin.random.Random
fun main() = application {
configure {
width = 720
height = 720
}
program {
val image = loadImage("demo-data/images/image-001.png")
extend {
val grid = drawer.bounds.grid(5, 5).flatten()
val r = Random(seconds.toInt())
for (cell in grid) {
drawer.imageFitSub(
image,
image.bounds.uniformSub(0.25, 0.75, 0.25, 0.75, random = r),
cell
)
}
}
}
}