Les images * Android * sont essentiellement générées, réduites et gérées par Bitmap, mais la fonction * OpenCV * est utilisée pour le traitement d'image et la composition transparente de cette application. Il existe deux façons d'utiliser * OpenCV * avec les applications * Android *. La première consiste à demander à l'utilisateur d'installer * OpenCV Manager *, et la seconde est de créer statiquement la bibliothèque partagée * OpenCV * sans * OpenCV Manager *. Le premier avantage est que la taille du package d'application (fichier * apk *) est plus petite car il n'inclut pas la bibliothèque partagée. Les inconvénients sont que vous devez installer * OpenCV Manager * et qu'il ne prend pas en charge la dernière version d'OpenCV. D'un autre côté, nous avons décidé que le problème de taille du deuxième fichier * apk *, qui est l'opposé du premier, ne serait pas un gros problème dans l'environnement réseau récent, et avons adopté la méthode d'inclusion de la bibliothèque partagée. (Je penserai quand une plainte viendra)
Cette application utilise * OpenCV * * Mat * (matrice bidimensionnelle à une ligne), donc la conversion entre * Bitmap * et * Mat * est requise. Auparavant, je vous ai dit que j'avais décidé d'incorporer un processus de rotation de l'image au lieu d'interdire la rotation du terminal lors du processus de transition d'écran (fragment), mais il y avait un problème avec le processus de mise en miroir de l'image.
Dans cette application, l'image de la galerie ou l'image prise par l'appareil photo est temporairement enregistrée sous forme de fichier.
Si vous exécutez cette application avec * API 24 / Android 7.0 / Nougat * ou supérieur, une exception se produira dans le traitement de * createTempFile * (nom de fichier unique).
Dans * API 24 / Android 7.0 / Nougat * et supérieur, une exception se produira dans le traitement après * isInvalid () * dans * File.createTempFile () *.
Au départ, j'ai essayé d'utiliser * Files.createTempFile () , mais la classe * Files * n'est implémentée que depuis * API 26 / Android 8.0 / Oreo * ( Java SE SDK 7 *). Nous ne nous soucions pas de * createTempFile () * séparément, nous ajoutons du temps absolu lorsque nous instancions la classe * File * pour créer un nom de fichier unique.
Nom de fichier unique
// .....Abréviation
fun getImageFile(context: Context, child: String): File {
context.filesDir.let { path ->
if (!path.exists()) path.mkdir()
return File("$path$child-${System.currentTimeMillis()}$SUFFIX_IMAGE") // $SUFFIX_IMAGE → ".jpg "
}
}
// .....Abréviation
Dans cette application, après avoir collé l'image d'image après la transition d'écran, appuyez sur le bouton [Miroir] sur l'écran d'affichage (de traitement) d'image d'image pour exécuter le traitement miroir de l'image d'image.
Lecture d'image d'image → * bitmapToMat (Bitmap → Mat) * → * Core.flip () * → * matToBitmap (Mat → Bitmap) * → * Le format de compression Bitmap * est * JPEG * lors de l'enregistrement de l'image par compression irréversible , Certaines données seront manquantes. Normalement, la détérioration est si discrète qu'il est difficile pour l'œil humain de juger, mais en répétant le processus plusieurs fois et en enregistrant l'image, la détérioration est devenue perceptible.
Image L'image a été enregistrée en changeant le format de compression * Bitmap * en * WEBP * (compatible avec la compression réversible).
Format de compression bitmap (WEBP)
// .....Abréviation
ByteArrayOutputStream().let { outStream ->
bitMap.compress(Bitmap.CompressFormat.WEBP, 100, outStream)
FileOutputStream(argument).apply {
outStream.writeTo(this)
close()
}
}
// .....Abréviation
Dans cette application, après avoir collé deux images d'image, appuyez sur le bouton [Entrée] sur l'écran d'affichage (traitement) d'image d'image pour effectuer un traitement de composition homogène des images d'image.
Dans le processus de composition transparente, * Photo.s SeamlessClone () * d'OpenCV * est utilisé, mais pour la composition (** veut ) l'image originale et la composition ( veut *) l'image et le masque de destination Si vous spécifiez une image, une erreur ( échec de l'assertion *) se produira.
Une erreur se produit si la taille de l'image d'origine à combiner () et celle de l'image à combiner () ne sont pas les mêmes. En outre, une erreur se produira dans une image à 4 canaux qui inclut la transparence. (Enfin remarqué dans le source * OpenCV * et la documentation * Photo.s SeamlessClone () *)
Faites la même taille de l'image d'origine que vous souhaitez combiner () et de l'image que vous souhaitez combiner (). De plus, chaque image est spécifiée par 3 canaux de 8 bits.
Conversion d'image de même taille
// .....Abréviation
private fun createThumbnailBitmap(
bitMap: Bitmap, reqWidth: Int, reqHeight: Int, filter: Boolean
): Bitmap = Bitmap.createScaledBitmap(bitMap, reqWidth, reqHeight, filter)
// .....Abréviation
Conversion de bitmap en mat
// .....Abréviation
fun bitmapToMat(bitMap: Bitmap?, colorCode: Int): Mat {
return Mat(bitMap?.height ?: 0, bitMap?.width ?: 0, CvType.CV_8UC3).apply {
Utils.bitmapToMat(bitMap,this, false)
Imgproc.cvtColor(this, this, colorCode, depth())
}
}
// .....Abréviation
Dans cette application, après avoir collé deux images d'image, appuyez sur le bouton [Entrée] sur l'écran d'affichage (traitement) d'image d'image pour effectuer un traitement de composition homogène des images d'image. Après la transition d'écran, appuyez sur le bouton [Enregistrer] sur l'écran des résultats de composition homogène pour enregistrer la galerie.
Même si l'image parfaitement composée est enregistrée dans la zone externe, elle n'est pas reconnue par * MediaScannerConnection.scanFile () * et n'est pas enregistrée dans la galerie.
Si vous enregistrez l'image parfaitement composée dans la zone de données externes (* Context.getExternalFilesDir () *), elle ne sera pas reconnue par * MediaScannerConnection.scanFile () *.
En enregistrant l'image parfaitement composée dans la zone partagée publique externe (* Environment.getExternalStoragePublicDirectory () *), elle a été reconnue par * MediaScannerConnection.scanFile () *.
Emplacement de stockage externe de la zone partagée publique
// .....Abréviation
fun getMixingExternalImageFile(): File {
//La zone de données interne n'est pas utilisée car la galerie ne peut être enregistrée que pour la zone partagée publique externe.
File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
PATH_MIXING_IMAGE // → "SeamlessCollage"
).let { file ->
if (!file.exists()) file.mkdir()
return File("$file$FILE_MIXING_IMAGE-${System.currentTimeMillis()}$SUFFIX_IMAGE")
}
}
// .....Abréviation
python
// .....Abréviation
MediaScannerConnection.scanFile(
context,
arrayOf(strUri),
arrayOf("image/jpeg"),
this // MediaScannerConnection.OnScanCompletedListener Callback
)
// .....Abréviation
Causes techniques et contre-mesures pour la première application Android et la dépendance à Kotlin 1. Traitement de la transition d'écran Android (fragment) 2. Traitement lié à la fonction de la caméra Android
Recommended Posts