Ich habe einen benutzerdefinierten Decoder, der Conceal verwendet, um verschlüsselte Bilder aus dem lokalen Speicher zu laden.Fresco benutzerdefinierte Bild Decoder Größenanpassung Optionen werden nicht angewendet
Alles funktioniert (Bilder werden angezeigt), aber die Leistung ist schrecklich, wenn lokale Kamerabilder geladen werden, da kein Downsampling oder Bitmap-Größenanpassung angewendet wird, wenn der eigentliche JPEG-Decoder funktioniert.
class CryptoImageDecoder(val crypto: Crypto, val poolFactory: PoolFactory) : ImageDecoder {
val defaultDecoder = DefaultImageDecoder(null,
Fresco.getImagePipelineFactory().platformDecoder,
Bitmap.Config.ARGB_8888)
override fun decode(encodedImage: EncodedImage,
length: Int,
qualityInfo: QualityInfo?,
options: ImageDecodeOptions?): CloseableImage {
encodedImage.use {
val inputStream = encodedImage.inputStream
inputStream.skip(CRYPTO_HEADER_BYTES.size.toLong()) //Skip header
val cipherInputStream = crypto.getCipherInputStream(inputStream, CRYPTO_ENTITY)
cipherInputStream.use {
val bytes = poolFactory.pooledByteBufferFactory.newByteBuffer(cipherInputStream)
val bytesClosable = CloseableReference.of(bytes)
val clearEncodedImage = EncodedImage(bytesClosable)
//This is always 1, no matter what resizeOptions I use in the request
//clearEncodedImage.sampleSize = how to calculate this?
clearEncodedImage.encodedCacheKey = encodedImage.encodedCacheKey
return defaultDecoder.decode(clearEncodedImage, bytes.size(), qualityInfo, options)
}
}
}
}
Die Art und Weise die Anfrage ziemlich einfach gemacht wird
val request = ImageRequestBuilder.newBuilderWithSource(attachment.sourceImageUri)
.setSource(attachment.sourceImageUri)
.setResizeOptions(ResizeOptions.forSquareSize(300))
.build()
val controller = Fresco.newDraweeControllerBuilder()
.setOldController(holder.draweeView.controller)
.setImageRequest(request)
.build()
Warum Resize-Optionen ignoriert, gibt es eine weitere Option, die ich für den Decoder bin fehlt?
Interessant, das scheint das Stück zu sein, das ich vermisse. Irgendeine Idee darüber, wie man diesen Produzenten für meinen Decoder integriert? Es sieht nicht so aus, als gäbe es einen einfachen Weg, um einen ProducerContext zu erhalten, um die Anfrage von meinem Decoder zu extrahieren. – minivac
Ich denke, der einfachste Weg dies zu tun ist, einen benutzerdefinierten Decoder zu liefern, der entschlüsselt und dekodiert. Wir haben noch nicht viel Dokumentation dafür, da sich dies noch ein wenig ändert, aber Sie können sich die Beispiel-App für die Unterstützung von SVG/Keyframes ansehen. Sie fügen ein neues Bildformat, einen Header-Checker und dann einen Entschlüsselungsdecoder hinzu, der nach Dekodierung intern an den Standarddecoder weiterleitet. –