enioka-Haute-Couture / enioka_scan

Integration library for all your Android hardware barcode scanner integration needs
Apache License 2.0
51 stars 5 forks source link

Problème de distorsion #150

Open fmanoir opened 9 months ago

fmanoir commented 9 months ago

Bonjour,

Bonjour @DaSpood, @marcanpilami

Je trouve un problème de distorsion sur Xcover 5 / Xcover 6, existe même sur votre démo

L'image s'affiche correctement après la première ouverture, mais si nous quittons l'interface et la réouvrons, il y a le problème de distorsion (Xcover 6)

Pour Xcover 5 c'est inversement distorsion -> quittons l'interface ou background -> réouvrons : Ok

Screenshot_20240111_095401 Screenshot_20240111_095419

DaSpood commented 9 months ago

Bonjour @fmanoir

Retours sur les problèmes de distortion: ces problèmes viennent du fait que la preview de la camera essaie de remplir l’écran peu importe sa resolution, ce qui provoque soit un étirement soit un aplatissement de l'image si sa resolution utilise un aspect ratio qui ne correspond pas exactement a la place disponible. Cette resolution peut aussi changer au fil du temps si les performances sont trop basses et que l'option useAdaptiveResolution est active, ce qui cause cette impression que l'image se degrade d'un essai a l'autre (la resolution est en fait modifiée, et le nouvel aspect ratio est plus ou moins proche de celui de la zone disponible compare a la precedente resolution).

Pour désactiver l’étirement de la photo, il est possible de changer dans le fichier xml du layout camera la valeur app:previewRatioMode a fitToPicture au lieu de fillAvailableSpace qui est sa valeur par défaut. Il est également possible de diminuer la valeur de maxDistortionRatio pour réduire la tolerance de deformation, mais le risque est qu'aucune des resolutions disponible ne soit suffisamment proche, auquel cas la bibliothèque les essaie une par une.

image

Avec ce paramètre, au lieu de chercher a remplir l'espace en s’étirant, l'image conservera son format, et aura des barres noires soit verticales soit horizontales si il reste de l'espace vide (comme lorsque l'on regarde un film au format 21:9 sur un écran de télé en 16:9).

J'ai effectué plusieurs tentatives de changements de resolution pour tenter de faire correspondre la resolution avec la place disponible mais la camera ne semble pas accepter de resolution ne correspondant pas a un format photo classique, dont l'aspect ratio correspond rarement a celui de l'application. Il est probablement possible de "crop" dynamiquement la preview mais je n'ai pas trouve de manière simple de le faire pour le moment.

fmanoir commented 8 months ago

Bonjour,

Je vous remercie pour votre réponse, j'ai essayé d'utiliser votre solution mais malheureusement, elle a eu le même comportement qu'auparavant.

  <com.enioka.scanner.camera.CameraBarcodeScanView
            android:id="@+id/camera_scan_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/bar"
            android:layout_alignParentBottom="true"
            app:forceCameraApiVersion="Auto"
            app:maxResolutionY="1080"
            app:minResolutionY="720"
            app:readerMode="Auto"
            app:previewRatioMode="fitToPicture"
            app:storePreferredResolution="true"
            app:targetColorActive="@color/colorRed"
            app:targetColorPaused="@color/defaultItemColor"
            app:targetIsFixed="false"
            app:targetStrokeWidth="5"
            app:useAdaptiveResolution="true">

Screenshot_20240116_105946

DaSpood commented 8 months ago

Je prendrai un peu de temps demain apres-midi pour essayer de reproduire, meme si je vois d'apres #151 que CameraV1 ne semble pas avoir ce problème.

fmanoir commented 8 months ago

Oui avec Camera V1 C'est Ok ; le souci avec Camera V2 uniquement.

DaSpood commented 8 months ago

Un fix est disponible dans la version 2.4.2, qui sera disponible sur maven central sous peu. Il devrait éviter la distortion en mode fitToPicture (mais n'affecte pas le mode fillAvailableSpace). J'ai testé ce fix sur le XCover 4 qui avait bien un problème d’étirement meme en fitToPicture avant.

fmanoir commented 8 months ago

Malheureusement, il me semble que même souci avec 2.4.2 avec

Screenshot_20240118_081933

DaSpood commented 8 months ago

Malheureusement j'ai peur de ne pas pouvoir aller plus loin sans le device exact qui a ce problème, il s'agit vraisemblablement d'un bug lie a la resolution de l’écran. J'avais pu le reproduire sur mes appareils mais le problème est corrigé de mon coté, et visiblement pas du votre.

Je laisse l'issue ouverte pour le moment mais la solution temporaire de forcer CameraV1 risque de devoir durer un moment, désolé.

@marcanpilami peut être qu'un regard neuf sur le problème pourrait aider

fmanoir commented 8 months ago

Oui, nous adaptons la solution temporaire de forcer CameraV1 mais jusqu'à quand :/

Sinon Je reproduis le problème sur tous les smartphones , même mon propre Samsung, il suffit de faire une rotation en mode paysage -> portrait et tu trouveras le problème.

La seule différence que je constate est que sur certains smartphones, le rendu est bon mais il y a un problème de distorsion lors de la rotation comme (Xcover6 , Samsung A54 , S21 ...) et d'autres le rendu directement distordu mais après un passage en arrière-plan, il est devenu bon puis même souci en rotation

DaSpood commented 8 months ago

@yurivital

DaSpood commented 6 months ago

Update:

currentPreviewResolution semble ne pas toujours etre set des la creation de la surface, donc la methode CameraPreviewSurfaceView.onMeasure() n'applique pas les bons parametres a la surface. Rafraichir l'ecran a nouveau (via verrouillage ou rotation) semble corriger le probleme, mais plus de tests doivent etre faits pour trouver un vrai fix dans le code.

Devra attendre la 3.0.