parent
4631e6ea01
commit
139140f631
@ -0,0 +1,77 @@ |
||||
package io.legado.app.utils |
||||
|
||||
import android.graphics.Canvas |
||||
import android.graphics.Bitmap |
||||
import android.graphics.drawable.PictureDrawable |
||||
import android.util.Size |
||||
import java.io.FileInputStream |
||||
import java.io.InputStream |
||||
import com.caverock.androidsvg.SVG |
||||
import com.caverock.androidsvg.PreserveAspectRatio |
||||
import com.caverock.androidsvg.SVGParseException |
||||
import kotlin.math.max |
||||
|
||||
@Suppress("WeakerAccess", "MemberVisibilityCanBePrivate") |
||||
object SvgUtils { |
||||
|
||||
/** |
||||
* 从Svg中解码bitmap |
||||
* https://github.com/qoqa/glide-svg/blob/master/library/src/main/java/ch/qoqa/glide/svg/SvgBitmapTranscoder.kt |
||||
*/ |
||||
|
||||
fun createBitmap(filePath: String, width: Int, height: Int? = null): Bitmap? { |
||||
val inputStream = FileInputStream(filePath) |
||||
return createBitmap(inputStream, width, height) |
||||
} |
||||
|
||||
fun createBitmap(inputStream: InputStream, width: Int, height: Int? = null): Bitmap? { |
||||
return kotlin.runCatching { |
||||
val svg = SVG.getFromInputStream(inputStream) |
||||
createBitmap(svg, width, height) |
||||
}.getOrNull() |
||||
} |
||||
|
||||
//获取svg图片大小 |
||||
fun getSize(filePath: String): Size? { |
||||
val inputStream = FileInputStream(filePath) |
||||
return getSize(inputStream) |
||||
} |
||||
|
||||
fun getSize(inputStream: InputStream): Size? { |
||||
return kotlin.runCatching { |
||||
val svg = SVG.getFromInputStream(inputStream) |
||||
getSize(svg) |
||||
}.getOrNull() |
||||
} |
||||
|
||||
/////// private method |
||||
private fun createBitmap(svg: SVG, width: Int, height: Int? = null): Bitmap { |
||||
val size = getSize(svg) |
||||
val wRatio = width.let { size.width / it } ?: -1 |
||||
val hRatio = height?.let { size.height / it } ?: -1 |
||||
//如果超出指定大小,则缩小相应的比例 |
||||
val ratio = when { |
||||
wRatio > 1 && hRatio > 1 -> max(wRatio, hRatio) |
||||
wRatio > 1 -> wRatio |
||||
hRatio > 1 -> hRatio |
||||
else -> 1 |
||||
} |
||||
svg.documentPreserveAspectRatio = PreserveAspectRatio.START |
||||
val picture = svg.renderToPicture(size.width / ratio, size.height / ratio) |
||||
val drawable = PictureDrawable(picture) |
||||
|
||||
val bitmap = Bitmap.createBitmap(size.width / ratio, size.height / ratio, Bitmap.Config.ARGB_8888) |
||||
val canvas = Canvas(bitmap) |
||||
canvas.drawPicture(drawable.picture) |
||||
return bitmap |
||||
} |
||||
|
||||
private fun getSize(svg: SVG): Size { |
||||
val width = svg.documentWidth.toInt().takeIf { it > 0 } |
||||
?: (svg.documentViewBox.right - svg.documentViewBox.left).toInt() |
||||
val height = svg.documentHeight.toInt().takeIf { it > 0 } |
||||
?: (svg.documentViewBox.bottom - svg.documentViewBox.top).toInt() |
||||
return Size(width, height) |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue