add BitmapDiffCalculator
This commit is contained in:
parent
1a462780c7
commit
6acbf227f2
|
@ -2,10 +2,10 @@ package oupson.apng
|
|||
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.BitmapFactory
|
||||
import oupson.apng.ImageUtils.PngEncoder
|
||||
import oupson.apng.ImageUtils.PnnQuantizer
|
||||
import oupson.apng.chunks.IDAT
|
||||
import oupson.apng.exceptions.NoFrameException
|
||||
import oupson.apng.utils.PngEncoder
|
||||
import oupson.apng.utils.Utils
|
||||
import oupson.apng.utils.Utils.Companion.getBlend_op
|
||||
import oupson.apng.utils.Utils.Companion.getDispose_op
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
package oupson.apng.ImageUtils
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.Color
|
||||
import android.graphics.Paint
|
||||
|
||||
class BitmapDiffCalculator(val firstBitmap: Bitmap, val secondBitmap : Bitmap) {
|
||||
val res : Bitmap
|
||||
var xOffset : Int = 0
|
||||
var yOffset : Int = 0
|
||||
init {
|
||||
val difBitmap = Bitmap.createBitmap(firstBitmap.width, firstBitmap.height, Bitmap.Config.ARGB_8888)
|
||||
val difCanvas = Canvas(difBitmap)
|
||||
for (y in 0 until firstBitmap.height) {
|
||||
for (x in 0 until firstBitmap.width) {
|
||||
if (firstBitmap.getPixel(x, y) != secondBitmap.getPixel(x, y)) {
|
||||
val colour = secondBitmap.getPixel(x, y)
|
||||
val paint = Paint().apply {
|
||||
this.color = colour
|
||||
}
|
||||
difCanvas.drawPoint(x.toFloat(), y.toFloat(), paint)
|
||||
}
|
||||
}
|
||||
}
|
||||
var width = difBitmap.width
|
||||
var height = difBitmap.height
|
||||
topLoop@for (y in 0 until difBitmap.height){
|
||||
for (x in 0 until difBitmap.width) {
|
||||
if (difBitmap.getPixel(x, y) != Color.TRANSPARENT) {
|
||||
break@topLoop
|
||||
}
|
||||
}
|
||||
yOffset += 1
|
||||
}
|
||||
bottomLoop@ while (true) {
|
||||
for (x in 0 until difBitmap.width) {
|
||||
if (difBitmap.getPixel(x, height - 1) != Color.TRANSPARENT) {
|
||||
break@bottomLoop
|
||||
}
|
||||
}
|
||||
height -= 1
|
||||
}
|
||||
leftLoop@for (x in 0 until difBitmap.width) {
|
||||
for (y in 0 until difBitmap.height) {
|
||||
if (difBitmap.getPixel(x, y) != Color.TRANSPARENT) {
|
||||
break@leftLoop
|
||||
}
|
||||
}
|
||||
xOffset += 1
|
||||
}
|
||||
rightLoop@ while (true) {
|
||||
for (y in 0 until difBitmap.height) {
|
||||
if (difBitmap.getPixel(width - 1, y) != Color.TRANSPARENT) {
|
||||
break@rightLoop
|
||||
}
|
||||
}
|
||||
width -= 1
|
||||
}
|
||||
val btm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
|
||||
val canvas2 = Canvas(btm)
|
||||
canvas2.drawBitmap(difBitmap, -xOffset.toFloat(), -yOffset.toFloat(), Paint())
|
||||
res = btm
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package oupson.apng.utils
|
||||
package oupson.apng.ImageUtils
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import java.io.ByteArrayOutputStream
|
||||
|
@ -80,22 +80,22 @@ class PngEncoder {
|
|||
* @param compressionLevel ! Don't use it : It's buggy
|
||||
*/
|
||||
fun encode(image: Bitmap, encodeAlpha: Boolean = false, filter: Int = 0, compressionLevel: Int = 0): ByteArray {
|
||||
this.filter = FILTER_NONE
|
||||
Companion.filter = FILTER_NONE
|
||||
if (filter <= FILTER_LAST) {
|
||||
this.filter = filter
|
||||
Companion.filter = filter
|
||||
}
|
||||
|
||||
if (compressionLevel in 0..9) {
|
||||
this.compressionLevel = compressionLevel
|
||||
Companion.compressionLevel = compressionLevel
|
||||
}
|
||||
|
||||
this.encodeAlpha = encodeAlpha
|
||||
Companion.encodeAlpha = encodeAlpha
|
||||
|
||||
|
||||
val pngIdBytes = byteArrayOf(-119, 80, 78, 71, 13, 10, 26, 10)
|
||||
width = image.width
|
||||
height = image.height
|
||||
this.image = image
|
||||
Companion.image = image
|
||||
/*
|
||||
* start with an array that is big enough to hold all the pixels
|
||||
* (plus filter bytes), and an extra 200 bytes for header info
|
Loading…
Reference in New Issue