mirror of
https://github.com/T8RIN/ImageToolbox.git
synced 2025-12-28 13:22:30 +00:00
Improve code
This commit is contained in:
parent
04010a5413
commit
41d20feea9
@ -23,7 +23,7 @@ import com.t8rin.imagetoolbox.core.domain.transformation.Transformation
|
||||
import com.t8rin.imagetoolbox.core.filters.domain.model.Filter
|
||||
import com.t8rin.imagetoolbox.core.ksp.annotations.FilterInject
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.Pixelate
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationLayer
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationCommands
|
||||
|
||||
@FilterInject
|
||||
internal class CirclePixelationFilter(
|
||||
@ -38,16 +38,7 @@ internal class CirclePixelationFilter(
|
||||
): Bitmap {
|
||||
return Pixelate.fromBitmap(
|
||||
input = input,
|
||||
layers = arrayOf(
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.setSize(value / 3f)
|
||||
.setOffset(value / 2)
|
||||
.build()
|
||||
)
|
||||
layers = PixelationCommands.circle(value)
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -23,7 +23,7 @@ import com.t8rin.imagetoolbox.core.domain.transformation.Transformation
|
||||
import com.t8rin.imagetoolbox.core.filters.domain.model.Filter
|
||||
import com.t8rin.imagetoolbox.core.ksp.annotations.FilterInject
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.Pixelate
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationLayer
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationCommands
|
||||
|
||||
@FilterInject
|
||||
internal class DiamondPixelationFilter(
|
||||
@ -38,20 +38,7 @@ internal class DiamondPixelationFilter(
|
||||
): Bitmap {
|
||||
return Pixelate.fromBitmap(
|
||||
input = input,
|
||||
layers = arrayOf(
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
|
||||
.setResolution(value)
|
||||
.setSize(value + 1)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
|
||||
.setResolution(value)
|
||||
.setOffset(value / 2)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Square)
|
||||
.setResolution(value)
|
||||
.setAlpha(0.6f)
|
||||
.build()
|
||||
)
|
||||
layers = PixelationCommands.diamond(value)
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -23,7 +23,7 @@ import com.t8rin.imagetoolbox.core.domain.transformation.Transformation
|
||||
import com.t8rin.imagetoolbox.core.filters.domain.model.Filter
|
||||
import com.t8rin.imagetoolbox.core.ksp.annotations.FilterInject
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.Pixelate
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationLayer
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationCommands
|
||||
|
||||
@FilterInject
|
||||
internal class EnhancedCirclePixelationFilter(
|
||||
@ -38,30 +38,7 @@ internal class EnhancedCirclePixelationFilter(
|
||||
): Bitmap {
|
||||
return Pixelate.fromBitmap(
|
||||
input = input,
|
||||
layers = arrayOf(
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Square)
|
||||
.setResolution(value)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.setOffset(value / 2)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.setSize(value / 1.2f)
|
||||
.setOffset(value / 2.5f)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.setSize(value / 1.8f)
|
||||
.setOffset(value / 3)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.setSize(value / 2.7f)
|
||||
.setOffset(value / 4)
|
||||
.build()
|
||||
)
|
||||
layers = PixelationCommands.enhancedCircle(value)
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -23,7 +23,7 @@ import com.t8rin.imagetoolbox.core.domain.transformation.Transformation
|
||||
import com.t8rin.imagetoolbox.core.filters.domain.model.Filter
|
||||
import com.t8rin.imagetoolbox.core.ksp.annotations.FilterInject
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.Pixelate
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationLayer
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationCommands
|
||||
|
||||
@FilterInject
|
||||
internal class EnhancedDiamondPixelationFilter(
|
||||
@ -39,26 +39,7 @@ internal class EnhancedDiamondPixelationFilter(
|
||||
): Bitmap {
|
||||
return Pixelate.fromBitmap(
|
||||
input = input,
|
||||
layers = arrayOf(
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Square)
|
||||
.setResolution(value)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
|
||||
.setResolution(value)
|
||||
.setOffset(value / 4)
|
||||
.setAlpha(0.5f)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
|
||||
.setResolution(value)
|
||||
.setOffset(value)
|
||||
.setAlpha(0.5f)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value / 3)
|
||||
.setSize(value / 6)
|
||||
.setOffset(value / 12)
|
||||
.build()
|
||||
)
|
||||
layers = PixelationCommands.enhancedDiamond(value)
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -23,7 +23,7 @@ import com.t8rin.imagetoolbox.core.domain.transformation.Transformation
|
||||
import com.t8rin.imagetoolbox.core.filters.domain.model.Filter
|
||||
import com.t8rin.imagetoolbox.core.ksp.annotations.FilterInject
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.Pixelate
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationLayer
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationCommands
|
||||
|
||||
@FilterInject
|
||||
internal class EnhancedPixelationFilter(
|
||||
@ -38,20 +38,7 @@ internal class EnhancedPixelationFilter(
|
||||
): Bitmap {
|
||||
return Pixelate.fromBitmap(
|
||||
input = input,
|
||||
layers = arrayOf(
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Square)
|
||||
.setResolution(value)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
|
||||
.setResolution(value / 4)
|
||||
.setSize(value / 6)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
|
||||
.setResolution(value / 4)
|
||||
.setSize(value / 6)
|
||||
.setOffset(value / 8)
|
||||
.build()
|
||||
)
|
||||
layers = PixelationCommands.enhancedSquare(value)
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -23,7 +23,7 @@ import com.t8rin.imagetoolbox.core.domain.transformation.Transformation
|
||||
import com.t8rin.imagetoolbox.core.filters.domain.model.Filter
|
||||
import com.t8rin.imagetoolbox.core.ksp.annotations.FilterInject
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.Pixelate
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationLayer
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationCommands
|
||||
|
||||
@FilterInject
|
||||
internal class PixelationFilter(
|
||||
@ -38,12 +38,7 @@ internal class PixelationFilter(
|
||||
): Bitmap {
|
||||
return Pixelate.fromBitmap(
|
||||
input = input,
|
||||
layers = arrayOf(
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Square)
|
||||
.setResolution(value - 4f)
|
||||
.setSize(value)
|
||||
.build()
|
||||
)
|
||||
layers = PixelationCommands.square(value)
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -26,7 +26,7 @@ import com.t8rin.imagetoolbox.core.domain.transformation.Transformation
|
||||
import com.t8rin.imagetoolbox.core.filters.domain.model.Filter
|
||||
import com.t8rin.imagetoolbox.core.ksp.annotations.FilterInject
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.Pixelate
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationLayer
|
||||
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationCommands
|
||||
import com.t8rin.trickle.Trickle
|
||||
|
||||
@FilterInject
|
||||
@ -40,31 +40,9 @@ internal class StrokePixelationFilter(
|
||||
input: Bitmap,
|
||||
size: IntegerSize
|
||||
): Bitmap {
|
||||
val pixelSize = value.first
|
||||
return Pixelate.fromBitmap(
|
||||
input = input,
|
||||
layers = arrayOf(
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(pixelSize)
|
||||
.setSize(pixelSize / 5)
|
||||
.setOffset(pixelSize / 4)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(pixelSize)
|
||||
.setSize(pixelSize / 4)
|
||||
.setOffset(pixelSize / 2)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(pixelSize)
|
||||
.setSize(pixelSize / 3)
|
||||
.setOffset(pixelSize / 1.3f)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(pixelSize)
|
||||
.setSize(pixelSize / 4)
|
||||
.setOffset(0f)
|
||||
.build()
|
||||
)
|
||||
layers = PixelationCommands.stroke(value.first)
|
||||
).let {
|
||||
Trickle.drawColorBehind(
|
||||
input = it,
|
||||
|
||||
@ -19,7 +19,7 @@ package com.t8rin.imagetoolbox.feature.filters.data.utils.convolution
|
||||
|
||||
import kotlin.math.abs
|
||||
|
||||
object ExtendedConvolutionKernels {
|
||||
internal object ExtendedConvolutionKernels {
|
||||
|
||||
/**
|
||||
* Diamond blur
|
||||
|
||||
@ -31,8 +31,7 @@ import androidx.core.graphics.withClip
|
||||
import androidx.core.graphics.withSave
|
||||
import kotlin.math.sqrt
|
||||
|
||||
|
||||
object Pixelate {
|
||||
internal object Pixelate {
|
||||
private val SQRT2 = sqrt(2.0).toFloat()
|
||||
|
||||
fun fromBitmap(
|
||||
|
||||
@ -0,0 +1,140 @@
|
||||
/*
|
||||
* ImageToolbox is an image editor for android
|
||||
* Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* You should have received a copy of the Apache License
|
||||
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
*/
|
||||
|
||||
package com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation
|
||||
|
||||
internal object PixelationCommands {
|
||||
|
||||
fun enhancedDiamond(value: Float): Array<PixelationLayer> = arrayOf(
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Square)
|
||||
.setResolution(value)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
|
||||
.setResolution(value)
|
||||
.setOffset(value / 4)
|
||||
.setAlpha(0.5f)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
|
||||
.setResolution(value)
|
||||
.setOffset(value)
|
||||
.setAlpha(0.5f)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value / 3)
|
||||
.setSize(value / 6)
|
||||
.setOffset(value / 12)
|
||||
.build()
|
||||
)
|
||||
|
||||
fun circle(value: Float): Array<PixelationLayer> = arrayOf(
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.setSize(value / 3f)
|
||||
.setOffset(value / 2)
|
||||
.build()
|
||||
)
|
||||
|
||||
fun diamond(value: Float): Array<PixelationLayer> = arrayOf(
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
|
||||
.setResolution(value)
|
||||
.setSize(value + 1)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
|
||||
.setResolution(value)
|
||||
.setOffset(value / 2)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Square)
|
||||
.setResolution(value)
|
||||
.setAlpha(0.6f)
|
||||
.build()
|
||||
)
|
||||
|
||||
fun enhancedCircle(value: Float): Array<PixelationLayer> = arrayOf(
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Square)
|
||||
.setResolution(value)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.setOffset(value / 2)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.setSize(value / 1.2f)
|
||||
.setOffset(value / 2.5f)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.setSize(value / 1.8f)
|
||||
.setOffset(value / 3)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.setSize(value / 2.7f)
|
||||
.setOffset(value / 4)
|
||||
.build()
|
||||
)
|
||||
|
||||
fun enhancedSquare(value: Float): Array<PixelationLayer> = arrayOf(
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Square)
|
||||
.setResolution(value)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
|
||||
.setResolution(value / 4)
|
||||
.setSize(value / 6)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
|
||||
.setResolution(value / 4)
|
||||
.setSize(value / 6)
|
||||
.setOffset(value / 8)
|
||||
.build()
|
||||
)
|
||||
|
||||
fun square(value: Float): Array<PixelationLayer> = arrayOf(
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Square)
|
||||
.setResolution(value - 4f)
|
||||
.setSize(value)
|
||||
.build()
|
||||
)
|
||||
|
||||
fun stroke(value: Float): Array<PixelationLayer> = arrayOf(
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.setSize(value / 5)
|
||||
.setOffset(value / 4)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.setSize(value / 4)
|
||||
.setOffset(value / 2)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.setSize(value / 3)
|
||||
.setOffset(value / 1.3f)
|
||||
.build(),
|
||||
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
|
||||
.setResolution(value)
|
||||
.setSize(value / 4)
|
||||
.setOffset(0f)
|
||||
.build()
|
||||
)
|
||||
|
||||
|
||||
}
|
||||
@ -20,7 +20,7 @@
|
||||
package com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation
|
||||
|
||||
|
||||
class PixelationLayer private constructor(val shape: Shape) {
|
||||
internal class PixelationLayer private constructor(val shape: Shape) {
|
||||
var enableDominantColor = false
|
||||
var resolution = 16f
|
||||
var size: Float? = null
|
||||
|
||||
Loading…
Reference in New Issue
Block a user