improvements to orx-object-fit -> orx-image-fit
This commit is contained in:
@@ -1,13 +1,13 @@
|
|||||||
# orx-object-fit
|
# orx-image-fit
|
||||||
|
|
||||||
Fits images in frames with two options, contain and cover. Similar to CSS object-fit (https://www.w3schools.com/css/css3_object-fit.asp)
|
Fits images in frames with two options, contain and cover. Similar to CSS object-fit (https://www.w3schools.com/css/css3_object-fit.asp)
|
||||||
|
|
||||||
## usage
|
## usage
|
||||||
|
|
||||||
`objectFit(img: ColorBuffer, x: Double, y: Double, w: Double, h: Double, fitMethod, horizontalPosition:Double, verticalPosition:Double)`
|
`imageFit(img: ColorBuffer, x: Double, y: Double, w: Double, h: Double, fitMethod, horizontalPosition:Double, verticalPosition:Double)`
|
||||||
|
|
||||||
|
|
||||||
objectFitType
|
fitMethod
|
||||||
- `contain`
|
- `contain`
|
||||||
- `cover`
|
- `cover`
|
||||||
|
|
||||||
82
orx-image-fit/src/main/kotlin/ImageFit.kt
Normal file
82
orx-image-fit/src/main/kotlin/ImageFit.kt
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
package org.openrndr.extras.imageFit
|
||||||
|
|
||||||
|
import org.openrndr.draw.ColorBuffer
|
||||||
|
import org.openrndr.draw.Drawer
|
||||||
|
import org.openrndr.math.map
|
||||||
|
import org.openrndr.shape.Rectangle
|
||||||
|
|
||||||
|
|
||||||
|
enum class FitMethod {
|
||||||
|
Cover,
|
||||||
|
Contain
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Drawer.imageFit(img: ColorBuffer, x: Double = 0.0, y: Double = 0.0, w: Double, h: Double, fitMethod:FitMethod = FitMethod.Cover, horizontalPosition:Double = 0.0, verticalPosition:Double = 0.0) {
|
||||||
|
val sourceWidth = img.width.toDouble()
|
||||||
|
val sourceHeight = img.height.toDouble()
|
||||||
|
|
||||||
|
var targetX = x
|
||||||
|
var targetY = y
|
||||||
|
|
||||||
|
var targetWidth: Double
|
||||||
|
var targetHeight: Double
|
||||||
|
|
||||||
|
val source: Rectangle
|
||||||
|
val target: Rectangle
|
||||||
|
|
||||||
|
when (fitMethod) {
|
||||||
|
FitMethod.Contain -> {
|
||||||
|
targetWidth = w
|
||||||
|
targetHeight = h
|
||||||
|
|
||||||
|
if (w <= targetWidth) {
|
||||||
|
targetWidth = w
|
||||||
|
targetHeight = (sourceHeight / sourceWidth) * w
|
||||||
|
}
|
||||||
|
|
||||||
|
if (h <= targetHeight) {
|
||||||
|
targetHeight = h
|
||||||
|
targetWidth = (sourceWidth / sourceHeight) * h
|
||||||
|
}
|
||||||
|
|
||||||
|
val left = x
|
||||||
|
val right = x + w - targetWidth
|
||||||
|
val top = y
|
||||||
|
val bottom = y + h - targetHeight
|
||||||
|
|
||||||
|
targetX = map(-1.0, 1.0, left, right, horizontalPosition)
|
||||||
|
targetY = map(-1.0, 1.0, top, bottom, verticalPosition)
|
||||||
|
|
||||||
|
source = Rectangle(0.0, 0.0, sourceWidth, sourceHeight)
|
||||||
|
target = Rectangle(targetX, targetY, targetWidth, targetHeight)
|
||||||
|
}
|
||||||
|
|
||||||
|
FitMethod.Cover -> {
|
||||||
|
targetWidth = sourceWidth
|
||||||
|
targetHeight = sourceHeight
|
||||||
|
|
||||||
|
if (sourceWidth <= targetWidth) {
|
||||||
|
targetWidth = sourceWidth
|
||||||
|
targetHeight = (h / w) * sourceWidth
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sourceHeight <= targetHeight) {
|
||||||
|
targetHeight = sourceHeight
|
||||||
|
targetWidth = (w / h) * sourceHeight
|
||||||
|
}
|
||||||
|
|
||||||
|
val left = 0.0
|
||||||
|
val right = sourceWidth - targetWidth
|
||||||
|
val top = 0.0
|
||||||
|
val bottom = sourceHeight - targetHeight
|
||||||
|
|
||||||
|
targetX = map(-1.0, 1.0, left, right, horizontalPosition)
|
||||||
|
targetY = map(-1.0, 1.0, top, bottom, verticalPosition)
|
||||||
|
|
||||||
|
source = Rectangle(targetX, targetY, targetWidth, targetHeight)
|
||||||
|
target = Rectangle(x, y, w, h)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
image(img, source, target)
|
||||||
|
}
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
package org.openrndr.extras.objectFit
|
|
||||||
|
|
||||||
import org.openrndr.draw.ColorBuffer
|
|
||||||
import org.openrndr.draw.Drawer
|
|
||||||
import org.openrndr.math.map
|
|
||||||
import org.openrndr.shape.Rectangle
|
|
||||||
|
|
||||||
|
|
||||||
enum class FitMethod {
|
|
||||||
Cover,
|
|
||||||
Contain
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Drawer.objectFit(img: ColorBuffer, x: Double = 0.0, y: Double = 0.0, w: Double, h: Double, fitMethod:FitMethod = FitMethod.Cover, horizontalPosition:Double = 0.0, verticalPosition:Double = 0.0) {
|
|
||||||
val sourceWidth = img.width.toDouble()
|
|
||||||
val sourceHeight = img.height.toDouble()
|
|
||||||
|
|
||||||
var targetX = x
|
|
||||||
var targetY = y
|
|
||||||
|
|
||||||
var targetWidth: Double
|
|
||||||
var targetHeight: Double
|
|
||||||
|
|
||||||
var source = Rectangle(x, y, w, h)
|
|
||||||
var target = Rectangle(x, y, w, h)
|
|
||||||
|
|
||||||
if (fitMethod == FitMethod.Contain) {
|
|
||||||
|
|
||||||
targetWidth = w
|
|
||||||
targetHeight = h
|
|
||||||
|
|
||||||
if (w <= targetWidth) {
|
|
||||||
targetWidth = w
|
|
||||||
targetHeight = (sourceHeight / sourceWidth) * w
|
|
||||||
}
|
|
||||||
|
|
||||||
if (h <= targetHeight) {
|
|
||||||
targetHeight = h
|
|
||||||
targetWidth = (sourceWidth / sourceHeight) * h
|
|
||||||
}
|
|
||||||
|
|
||||||
val left = x
|
|
||||||
val right = x + w - targetWidth
|
|
||||||
val top = y
|
|
||||||
val bottom = y + h - targetHeight
|
|
||||||
|
|
||||||
targetX = map(-1.0, 1.0, left, right, horizontalPosition)
|
|
||||||
targetY = map(-1.0, 1.0, top, bottom, verticalPosition)
|
|
||||||
|
|
||||||
source = Rectangle(0.0, 0.0, sourceWidth, sourceHeight)
|
|
||||||
target = Rectangle(targetX, targetY, targetWidth, targetHeight)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (fitMethod == FitMethod.Cover) {
|
|
||||||
|
|
||||||
targetWidth = sourceWidth
|
|
||||||
targetHeight = sourceHeight
|
|
||||||
|
|
||||||
if (sourceWidth <= targetWidth) {
|
|
||||||
targetWidth = sourceWidth
|
|
||||||
targetHeight = (h / w) * sourceWidth
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sourceHeight <= targetHeight) {
|
|
||||||
targetHeight = sourceHeight
|
|
||||||
targetWidth = (w / h) * sourceHeight
|
|
||||||
}
|
|
||||||
|
|
||||||
val left = 0.0
|
|
||||||
val right = sourceWidth - targetWidth
|
|
||||||
val top = 0.0
|
|
||||||
val bottom = sourceHeight - targetHeight
|
|
||||||
|
|
||||||
targetX = map(-1.0, 1.0, left, right, horizontalPosition)
|
|
||||||
targetY = map(-1.0, 1.0, top, bottom, verticalPosition)
|
|
||||||
|
|
||||||
source = Rectangle(targetX, targetY, targetWidth, targetHeight)
|
|
||||||
target = Rectangle(x, y, w, h)
|
|
||||||
}
|
|
||||||
|
|
||||||
image(img, source, target)
|
|
||||||
}
|
|
||||||
@@ -29,4 +29,4 @@ include 'orx-camera',
|
|||||||
'orx-kinect-v1-natives-macos',
|
'orx-kinect-v1-natives-macos',
|
||||||
'orx-kinect-v1-natives-windows',
|
'orx-kinect-v1-natives-windows',
|
||||||
'orx-kinect-v1-demo',
|
'orx-kinect-v1-demo',
|
||||||
'orx-object-fit'
|
'orx-image-fit'
|
||||||
|
|||||||
Reference in New Issue
Block a user