[JAVA] Technische Ursachen und Gegenmaßnahmen für Punkte, die von Android-Apps und Kotlin abhängig sind (3. Verarbeitung in Bezug auf Android-Bilder)

3. 3. * Android * Bildverarbeitung

Da diese Anwendung * OpenCV * * Mat * (einzeilige zweidimensionale Matrix) verwendet, ist eine Konvertierung zwischen * Bitmap * und * Mat * erforderlich. Zuvor habe ich Ihnen gesagt, dass ich beschlossen habe, einen Prozess zum Drehen des Bilds zu integrieren, anstatt die Drehung des Terminals beim Bildschirmübergang (Fragment) zu verbieten, aber es gab ein Problem mit dem Bildbildspiegelungsprozess.

3.1 * createTempFile () * (eindeutiger Dateiname) Verarbeitung der * File * -Klasse

In dieser Anwendung wird das Bild der Galerie oder das von der Kamera aufgenommene Bild vorübergehend als Datei gespeichert.

Wenn Sie diese Anwendung mit * API 24 / Android 7.0 / Nougat * oder höher ausführen, tritt bei der Verarbeitung * createTempFile * (eindeutiger Dateiname) eine Ausnahme auf.

In * API 24 / Android 7.0 / Nougat * und höher tritt bei der Verarbeitung nach * isInvalid () * in * File.createTempFile () * eine Ausnahme auf.

Anfangs habe ich versucht, * Files.createTempFile () * zu verwenden, aber die Klasse * Files * ist erst seit * API 26 / Android 8.0 / Oreo * (* Java SE SDK 7 *) implementiert.

Eindeutiger Dateiname


// .....Abkürzung
	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 "
		}
	}
// .....Abkürzung

3.2 Bildbildspiegelverarbeitung mit * OpenCV *

Berühren Sie in dieser Anwendung nach dem Einfügen des Bilds nach dem Bildschirmübergang die Schaltfläche [Spiegeln] auf dem Bildschirm für die Bildbildanzeige (-verarbeitung), um die Spiegelverarbeitung des Bilds durchzuführen.

Lesen von Bildbildern → * bitmapToMat (Bitmap → Mat) * → * Core.flip () * → * matToBitmap (Mat → Bitmap) * → * Bitmap * Das Komprimierungsformat ist * JPEG *, wenn das Bild durch irreversible Komprimierung gespeichert wird Einige Daten fehlen. Normalerweise ist die Verschlechterung so unauffällig, dass es für das menschliche Auge schwierig ist, sie zu beurteilen. Durch mehrmaliges Wiederholen des Vorgangs und Speichern des Bildes wurde die Verschlechterung jedoch spürbar.

Bild Das Bild wurde gespeichert, indem das Komprimierungsformat * Bitmap * in * WEBP * geändert wurde (kompatible reversible Komprimierung).

Bitmap-Komprimierungsformat (WEBP)


// .....Abkürzung
	ByteArrayOutputStream().let { outStream ->
		bitMap.compress(Bitmap.CompressFormat.WEBP, 100, outStream)
		FileOutputStream(Streit).apply {
			outStream.writeTo(this)
			close()
		}
	}
// .....Abkürzung

3.3 Nahtlose Kompositionsverarbeitung mit * OpenCV *

Berühren Sie in dieser Anwendung nach dem Einfügen von zwei Bildbildern die Schaltfläche [Enter] auf dem Bildschirm für die Bildbildanzeige (-verarbeitung), um eine nahtlose Kompositionsverarbeitung der Bildbilder durchzuführen.

Beim nahtlosen Zusammensetzen wird * OpenCV * 's * Photo.seamlessClone () * verwendet, jedoch zum Zusammensetzen (** will ) des Originalbilds und zum Zusammensetzen ( will *) des Zielbilds und der Maske Wenn Sie ein Bild angeben, tritt ein Fehler ( Bestätigung fehlgeschlagen *) auf.

Ein Fehler tritt auf, wenn die Größe des zu kombinierenden Originalbilds () und des zu kombinierenden Bildes () nicht identisch sind. Außerdem tritt ein Fehler in einem 4-Kanal-Bild auf, das Transparenz enthält. (Endlich in der * OpenCV * -Quelle und in der * Photo.seamlessClone () * -Dokumentation vermerkt)

Stellen Sie die Größe des Originalbilds, das Sie kombinieren möchten () und des Bildes, das Sie kombinieren möchten (), gleich ein. Zusätzlich wird jedes Bild durch 3 Kanäle mit 8 Bits spezifiziert.

Bildkonvertierung gleicher Größe


// .....Abkürzung
	private fun createThumbnailBitmap(
		bitMap: Bitmap, reqWidth: Int, reqHeight: Int, filter: Boolean
	): Bitmap = Bitmap.createScaledBitmap(bitMap, reqWidth, reqHeight, filter)
// .....Abkürzung

Konvertierung von Bitmap in Mat


// .....Abkürzung
	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())
		}
	}
// .....Abkürzung

3.4 Registrierungsprozess für nahtlose zusammengesetzte Bildergalerien

Berühren Sie in dieser Anwendung nach dem Einfügen von zwei Bildbildern die Schaltfläche [Enter] auf dem Bildschirm für die Bildbildanzeige (-verarbeitung), um eine nahtlose Kompositionsverarbeitung der Bildbilder durchzuführen. Berühren Sie nach dem Bildschirmübergang die Schaltfläche [Speichern] im Ergebnisbildschirm für nahtlose Kompositionen, um die Galerie zu registrieren.

Selbst wenn das nahtlos zusammengesetzte Bild im externen Bereich gespeichert wird, wird es von * MediaScannerConnection.scanFile () * nicht erkannt und nicht in der Galerie registriert.

Wenn Sie das nahtlos zusammengesetzte Bild im externen Datenbereich (* Context.getExternalFilesDir () *) speichern, wird es von * MediaScannerConnection.scanFile () * nicht erkannt.

Durch Speichern des nahtlos zusammengesetzten Bildes im externen öffentlichen freigegebenen Bereich (* Environment.getExternalStoragePublicDirectory () *) wurde es von * MediaScannerConnection.scanFile () * erkannt.

Externer öffentlicher Speicherort für gemeinsam genutzte Bereiche


// .....Abkürzung
	fun getMixingExternalImageFile(): File {
		//Der interne Datenbereich wird nicht verwendet, da die Galerie nur für den externen öffentlichen freigegebenen Bereich registriert werden kann.
		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")
		}
	}
// .....Abkürzung

python


// .....Abkürzung
	MediaScannerConnection.scanFile(
		context,
		arrayOf(strUri),
		arrayOf("image/jpeg"),
		this // MediaScannerConnection.OnScanCompletedListener Callback
	)
// .....Abkürzung

Verknüpfung

Technische Ursachen und Gegenmaßnahmen für die erste Android-App und Kotlin-Sucht 1. Verarbeitung des Android-Bildschirmübergangs (Fragment) 2. Verarbeitung im Zusammenhang mit der Android-Kamerafunktion

Recommended Posts

Technische Ursachen und Gegenmaßnahmen für Punkte, die von Android-Apps und Kotlin abhängig sind (3. Verarbeitung in Bezug auf Android-Bilder)
Technische Ursachen und Gegenmaßnahmen für Punkte, die von Android-Apps und Kotlin abhängig sind (1. Verarbeitung des Android-Bildschirmübergangs (Fragment))
Technische Ursachen und Gegenmaßnahmen für Punkte, denen ich mit der Android-App und Kotlin verfallen war (2. Verarbeitung im Zusammenhang mit der Kamerafunktion von Android *)
Technische Ursachen und Gegenmaßnahmen für die Punkte, denen ich mit der ersten Android-App und Kotlin verfallen war
Konvertieren Sie alle Android-Apps (Java) in Kotlin
Zusammenfassung der guten Punkte und Vorsichtsmaßnahmen bei der Konvertierung der Java Android-Anwendung in Kotlin
Geben Sie Optionen für die Java / Kotlin-Kompilierungszeit für Android-Apps an
VSCode Java Debugger für Java Build fehlgeschlagen Ursachen und Gegenmaßnahmen