Introduce ColorMode enum

This commit is contained in:
Pierre-Yves Nicolas
2026-03-29 14:48:16 +02:00
parent 3681d5771d
commit 7d01493477
12 changed files with 47 additions and 33 deletions

View File

@@ -33,6 +33,7 @@ import org.fairscan.app.domain.PageMetadata
import org.fairscan.app.domain.PageViewKey
import org.fairscan.app.domain.Rotation
import org.fairscan.app.domain.ScanPage
import org.fairscan.imageprocessing.ColorMode
import org.fairscan.imageprocessing.Point
import org.fairscan.imageprocessing.Quad
import java.io.File
@@ -151,7 +152,7 @@ class ImageRepository(
quad = metadata.normalizedQuad.toSerializable(),
baseRotationDegrees = metadata.baseRotation.degrees,
manualRotationDegrees = Rotation.R0.degrees,
isColored = metadata.isColored
isColored = metadata.autoColorMode == ColorMode.COLOR
)
)
saveMetadata()
@@ -313,6 +314,6 @@ fun PageV2.toMetadata(): PageMetadata? {
return PageMetadata(
quad.toQuad(),
Rotation.fromDegrees(baseRotationDegrees),
isColored
if (isColored) ColorMode.COLOR else ColorMode.GRAYSCALE
)
}

View File

@@ -98,7 +98,7 @@ private fun prepareJpegForHigh(
decoded,
quad,
pageMetadata.baseRotation.add(manualRotation).degrees,
pageMetadata.isColored,
pageMetadata.autoColorMode,
exportQuality.maxPixels
)
return Jpeg.fromMat(page, exportQuality.jpegQuality)

View File

@@ -14,12 +14,13 @@
*/
package org.fairscan.app.domain
import org.fairscan.imageprocessing.ColorMode
import org.fairscan.imageprocessing.Quad
data class PageMetadata(
val normalizedQuad: Quad,
val baseRotation: Rotation,
val isColored: Boolean,
val autoColorMode: ColorMode,
)
data class ScanPage(

View File

@@ -104,6 +104,7 @@ import org.fairscan.app.ui.components.pageCountText
import org.fairscan.app.ui.dummyNavigation
import org.fairscan.app.ui.fakeDocument
import org.fairscan.app.ui.theme.FairScanTheme
import org.fairscan.imageprocessing.ColorMode
import org.fairscan.imageprocessing.Point
import org.fairscan.imageprocessing.Quad
@@ -539,7 +540,7 @@ fun CameraScreenPreviewWithProcessedImage() {
CapturedPage(
debugImage("gallica.bnf.fr-bpt6k5530456s-1.jpg"),
CompletableDeferred(Jpeg(ByteArray(0))),
PageMetadata(quad, R0, false))))
PageMetadata(quad, R0, ColorMode.COLOR))))
}
@Preview(showBackground = true, widthDp = 640, heightDp = 320)

View File

@@ -40,7 +40,7 @@ import org.fairscan.imageprocessing.Mask
import org.fairscan.imageprocessing.Quad
import org.fairscan.imageprocessing.detectDocumentQuad
import org.fairscan.imageprocessing.extractDocument
import org.fairscan.imageprocessing.isColoredDocument
import org.fairscan.imageprocessing.autoColorMode
import org.fairscan.imageprocessing.scaledTo
import org.opencv.android.Utils
import org.opencv.core.Mat
@@ -230,16 +230,16 @@ fun extractDocumentFromBitmap(
val bgr = Mat()
Imgproc.cvtColor(rgba, bgr, Imgproc.COLOR_RGBA2BGR) // CV_8UC4 → CV_8UC3
rgba.release()
val isColored = isColoredDocument(bgr, mask, quad)
val colorMode = autoColorMode(bgr, mask, quad)
val maxPixels = ExportQuality.BALANCED.maxPixels
val page = extractDocument(bgr, quad, rotationDegrees, isColored, maxPixels)
val page = extractDocument(bgr, quad, rotationDegrees, colorMode, maxPixels)
val pageJpeg = Jpeg.fromMat(page, ExportQuality.BALANCED.jpegQuality)
bgr.release()
page.release()
val normalizedQuad = quad.scaledTo(source.width, source.height, 1, 1)
val baseRotation = Rotation.fromDegrees(rotationDegrees)
val metadata = PageMetadata(normalizedQuad, baseRotation, isColored)
val metadata = PageMetadata(normalizedQuad, baseRotation, colorMode)
val sourceJpegDeferred = viewModelScope.async(Dispatchers.IO) {
compressJpeg(source, 90)
}