[JAVA] Causes techniques et contre-mesures pour les points accro aux applications Android et Kotlin (3. Traitement lié aux images Android)

3. 3. * Traitement d'image Android *

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.

3.1 * CreateTempFile () * (nom de fichier unique) traitement de la classe * File *

Dans cette application, l'image de la galerie ou l'image prise par l'appareil photo est temporairement enregistrée sous forme de fichier.

<Problème>

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

3.2 Traitement du miroir d'image avec * OpenCV *

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.

<Problème>

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

3.3 Traitement de composition fluide avec * OpenCV *

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.

<Problème>

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

3.4 Processus d'enregistrement homogène de la galerie d'images composites

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.

<Problème>

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

Lien

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

Causes techniques et contre-mesures pour les points accro aux applications Android et Kotlin (3. Traitement lié aux images Android)
Causes techniques et contre-mesures pour les points accro aux applications Android et Kotlin (1. Traitement de la transition d'écran Android (fragment))
Causes techniques et contre-mesures pour les points auxquels j'étais accro avec l'application Android et Kotlin (2. Traitement lié à la fonction caméra d'Android *)
Causes techniques et contre-mesures pour les points auxquels j'étais accro avec la première application Android et Kotlin
Convertir toutes les applications Android (Java) en Kotlin
Résumé des bons points et des précautions lors de la conversion de l'application Java Android vers Kotlin
Spécifier les options de compilation Java / Kotlin pour les applications Android
Le débogueur Java VSCode pour la construction Java a échoué Causes et contre-mesures