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.
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
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
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
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
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