https://libspectrum.io/docs/getting_started_android
https://github.com/facebookincubator/spectrum
PNG, GIF, JPG, WEP, HEIF 인코딩/디코딩/트랜스코딩을 지원한다고 해서 관심이 가진다. 아직 구현단계라서 안 되는 기능이 많다.
package com.mdiwebma.screenshot.utils
import android.graphics.Bitmap
import android.util.Log
import com.facebook.spectrum.EncodedImageSink
import com.facebook.spectrum.Spectrum
import com.facebook.spectrum.SpectrumSoLoader
import com.facebook.spectrum.image.EncodedImageFormat
import com.facebook.spectrum.logging.SpectrumLogcatLogger
import com.facebook.spectrum.options.EncodeOptions
import com.facebook.spectrum.plugins.SpectrumPluginWebp
import com.facebook.spectrum.requirements.EncodeRequirement
import com.mdiwebma.base.ApplicationKeeper
import java.io.FileOutputStream
object SpectrumHelper {
init {
SpectrumSoLoader.init(ApplicationKeeper.get())
}
private val spectrum = Spectrum.make(
SpectrumLogcatLogger(Log.INFO),
arrayOf(SpectrumPluginWebp())
//DefaultPlugins.get()
)
// if (width > 16383 || height > 16383) saveToWebp() throw SpectrumException
// https://developers.google.com/speed/webp/faq#what_is_the_maximum_size_a_webp_image_can_be
// namespace webp {
//
// static constexpr std::uint32_t maximumSizeDimension = 16383;
// void ICompressor::enforceSizeBelowMaximumSideDimension(
// const image::Size& size,
// const std::uint32_t maximumSideDimensions) {
// SPECTRUM_ERROR_IF(
// size.width > maximumSideDimensions || size.height > maximumSideDimensions,
// error::CompressorInputSizeTooLarge);
// }
fun saveToWebp(bitmap: Bitmap, quality: Int, outputStream: FileOutputStream): Boolean {
val encodeRequirement = EncodeRequirement(
EncodedImageFormat.WEBP,
quality,
EncodeRequirement.Mode.LOSSY
)
val encodeOption = EncodeOptions.Builder(encodeRequirement).build()
val result = spectrum.encode(
bitmap,
EncodedImageSink.from(outputStream),
encodeOption,
null
)
return result.isSuccessful
}
fun saveToWebpLossless(bitmap: Bitmap, outputStream: FileOutputStream): Boolean {
val encodeRequirement = EncodeRequirement(
EncodedImageFormat.WEBP,
EncodeRequirement.Mode.LOSSLESS
)
val encodeOption = EncodeOptions.Builder(encodeRequirement).build()
val result = spectrum.encode(
bitmap,
EncodedImageSink.from(outputStream),
encodeOption,
null
)
return result.isSuccessful
}
fun saveToPng(bitmap: Bitmap, outputStream: FileOutputStream): Boolean {
val encodeRequirement = EncodeRequirement(
EncodedImageFormat.PNG,
EncodeRequirement.Mode.LOSSLESS
)
val encodeOption = EncodeOptions.Builder(encodeRequirement).build()
val result = spectrum.encode(
bitmap,
EncodedImageSink.from(outputStream),
encodeOption,
null
)
return result.isSuccessful
}
fun saveToJpeg(bitmap: Bitmap, quality: Int, outputStream: FileOutputStream): Boolean {
val encodeRequirement = EncodeRequirement(
EncodedImageFormat.JPEG,
quality,
EncodeRequirement.Mode.LOSSY
)
val encodeOption = EncodeOptions.Builder(encodeRequirement).build()
val result = spectrum.encode(
bitmap,
EncodedImageSink.from(outputStream),
encodeOption,
null
)
return result.isSuccessful
}
}