add BitmapDiffCalculator

This commit is contained in:
oupson 2018-12-14 14:47:01 +01:00
parent 1a462780c7
commit 6acbf227f2
3 changed files with 72 additions and 7 deletions

View File

@ -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

View File

@ -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
}
}

View File

@ -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