From 48076c69a5b7c4ea13a05ec933aecab34a525ded Mon Sep 17 00:00:00 2001 From: dnutiu Date: Sat, 27 Apr 2024 23:50:33 +0300 Subject: [PATCH] display an error when image fails to be analyzed --- .../imagetagger/core/AnalyzedImage.kt | 22 +++++++++++++-- .../ui/controls/ImageTagsEntryControl.kt | 26 +++++++++++++----- .../ui/controls/image-tags-entry.css | 5 ++++ .../ui/controls/image-tags-entry.fxml | 4 +-- .../imagetagger/ui/controls/images/failed.png | Bin 0 -> 33632 bytes 5 files changed, 45 insertions(+), 12 deletions(-) create mode 100644 img-ui/src/main/resources/dev/nuculabs/imagetagger/ui/controls/image-tags-entry.css create mode 100644 img-ui/src/main/resources/dev/nuculabs/imagetagger/ui/controls/images/failed.png diff --git a/img-core/src/main/kotlin/dev/nuculabs/imagetagger/core/AnalyzedImage.kt b/img-core/src/main/kotlin/dev/nuculabs/imagetagger/core/AnalyzedImage.kt index 005a261..1e763fa 100644 --- a/img-core/src/main/kotlin/dev/nuculabs/imagetagger/core/AnalyzedImage.kt +++ b/img-core/src/main/kotlin/dev/nuculabs/imagetagger/core/AnalyzedImage.kt @@ -15,6 +15,7 @@ class AnalyzedImage(private val file: File, imageTagsPrediction: IImageTagsPredi private var predictedTags: List = emptyList() private val logger: Logger = Logger.getLogger("AnalyzedImage") private var error: String = "" + private var hasError: Boolean = false /** * Initializes the analyzed image and predicts its tags. @@ -23,24 +24,39 @@ class AnalyzedImage(private val file: File, imageTagsPrediction: IImageTagsPredi try { bufferedImage = ImageIO.read(File(file.absolutePath)) predictedTags = imageTagsPrediction.predictTags(bufferedImage!!) + } catch (e: NullPointerException) { + val message = "Error while predicting image: invalid image type or type not supported." + logger.warning(message) + hasError = true + error = message } catch (e: Exception) { - logger.warning("Error while predicting images $e") + val message = "Error loading image $e" + logger.warning(message) + hasError = true error = e.message.toString() } } + /** + * Returns a boolean indicating if the image analysis has errors. + * The flag is `True` if it has errors, `False` otherwise. + */ + fun hasError(): Boolean { + return hasError + } + /** * Returns the prediction error */ fun errorMessage(): String { - return error; + return error } /** * Returns the absolute file path of the image. */ fun absolutePath(): String { - return file.absolutePath; + return file.absolutePath } /** diff --git a/img-ui/src/main/kotlin/dev/nuculabs/imagetagger/ui/controls/ImageTagsEntryControl.kt b/img-ui/src/main/kotlin/dev/nuculabs/imagetagger/ui/controls/ImageTagsEntryControl.kt index 51439a1..aa047e1 100644 --- a/img-ui/src/main/kotlin/dev/nuculabs/imagetagger/ui/controls/ImageTagsEntryControl.kt +++ b/img-ui/src/main/kotlin/dev/nuculabs/imagetagger/ui/controls/ImageTagsEntryControl.kt @@ -60,8 +60,13 @@ class ImageTagsEntryControl(private val image: AnalyzedImage) : HBox() { } catch (exception: IOException) { throw RuntimeException(exception) } - setImage(image.absolutePath()) - setText(image.tags()) + setImage(image) + if (image.hasError()) { + setText(listOf(image.errorMessage())) + } else { + setText(image.tags()) + } + setupEventHandlers() } @@ -95,13 +100,20 @@ class ImageTagsEntryControl(private val image: AnalyzedImage) : HBox() { /** * Setter for setting the image. */ - private fun setImage(imagePath: String) { - val file = File(imagePath) - file.inputStream().use { - imageView.image = Image(it, 244.0, 244.0, true, true) + private fun setImage(analyzedImage: AnalyzedImage) { + val file = File(analyzedImage.absolutePath()) + if (analyzedImage.hasError()) { + fileNameLabel.text = "Failed: ${file.name}" + fileNameLabel.styleClass.add("errorLabel") + imageView.image = Image(this.javaClass.getResourceAsStream("images/failed.png")) imageView.isCache = true + } else { + file.inputStream().use { + imageView.image = Image(it, 244.0, 244.0, true, true) + imageView.isCache = true + } + fileNameLabel.text = "File: ${file.name}" } - fileNameLabel.text = "File: ${file.name}" } /** diff --git a/img-ui/src/main/resources/dev/nuculabs/imagetagger/ui/controls/image-tags-entry.css b/img-ui/src/main/resources/dev/nuculabs/imagetagger/ui/controls/image-tags-entry.css new file mode 100644 index 0000000..56f99bc --- /dev/null +++ b/img-ui/src/main/resources/dev/nuculabs/imagetagger/ui/controls/image-tags-entry.css @@ -0,0 +1,5 @@ + +.errorLabel { + -fx-text-background-color: red; + -fx-font-family: "Inter Bold" +} \ No newline at end of file diff --git a/img-ui/src/main/resources/dev/nuculabs/imagetagger/ui/controls/image-tags-entry.fxml b/img-ui/src/main/resources/dev/nuculabs/imagetagger/ui/controls/image-tags-entry.fxml index a38a24f..46a7b7c 100644 --- a/img-ui/src/main/resources/dev/nuculabs/imagetagger/ui/controls/image-tags-entry.fxml +++ b/img-ui/src/main/resources/dev/nuculabs/imagetagger/ui/controls/image-tags-entry.fxml @@ -6,8 +6,8 @@ - - + + diff --git a/img-ui/src/main/resources/dev/nuculabs/imagetagger/ui/controls/images/failed.png b/img-ui/src/main/resources/dev/nuculabs/imagetagger/ui/controls/images/failed.png new file mode 100644 index 0000000000000000000000000000000000000000..4df4629b5d4d91af9609b4531af58d301d0bd2f0 GIT binary patch literal 33632 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