Aide - Recherche - Membres - Calendrier
Version complète : Bitmap - density
Les Forums de PalmAttitude.org > GENERAL PalmOS > Développement sous PalmOS > Développement HB++
Guy-Lux
Voilà.

Je stocke des bitmaps dans un PDB, le veux les lire et les afficher et j'ai un problème.

Les bitmaps sont stockées en low-density; si j'affiche directement une bitmap lue, ca fonctionne mais c'est moche (et beaucoup trop grand) :



Si je passe cette bitmap lue dans la moulinette décrite ICI, elle prend la bonne taille, mais est totalement déformée et illisible :



J'ai aussi essayé de stocker directement des bitmap en d144 dans mon PDB et et supprimé la moulinette, le résultat à l'affichage est identique.
J'ai loupé quelquechose, mais je ne vois pas quoi.
Si quelqu'un a une idée...
snark
Tu as changé le ScreenMode?
Patrice
Pas franchement d'idée, mais essaye tout de même de passer ton bitmap en 264 pixels de large.
Guy-Lux
Heu, non...
Je verrai ce soir.
Merci pour la piste.
Patrice
Sauf grossière erreur de ma part, les APIs d'affichage de bitmaps prennent en charge les différentes densités sans nécessiter d'autre intervention.
El Barto
Problème connu de la moulinette en question. La hauteur ou la largeur de ton image n'est pas un chiffre pair.
En son temps j'avais fait des tests. Je vais regarder ce soir si j'avais trouvé une solution.
Orabig
Extrait du lien que tu donnes Guy-lux :
CITATION
The density and scale factor being hard coded, you must not call this function if the device does not have a double density screen, which you can check by calling the SystemInfo.ScreenDensity property, or if the width of the source image expressed in pixels is odd.

Donc, le plus simple pour toi, c'est de créer une image totalement identique qui fait un pixel de plus (ou de moins) avant de passer la moulinette.

En gros, le code doit ressembler à ça :
CODE
Public Function ChangeDensity(ByRef src as Bitmap) as Bitmap
  Dim dst as New Bitmap, cx as Integer, cy as Integer, cb as Integer
  Dim s as New StreamMemory

  cx=src.Width
  cy=src.Height
  cb=src.BitDepth

    if (cx mod 2 = 1) then
        ' La routine ne fonctionne pas si la largeur est impaire
        dim even as new Bitmap
        even.Create cx-1,cy,cb,src.Density
        even.CopyArea 0,0,cx-1,cy,src,0,0
        set src=even
    end if

  Write s, src
  s.Seek 2
  Write s, cx/2
  Write s, cy/2
  Write s, CInt(((CLng(cx)*CLng(cb)+15)/16)*2)
  s.Seek 10
  Write s, CInt(144)
  s.SeekToBegin
  Read s, dst

  Set ChangeDensity=dst
End Function


Attention, j'ai mis cx-1, ce qui "rogne" le pixel de droite. Si tu mets cx+1, tu ne perds pas d'info, par contre tu peux avoir une couleur bizarre sur la dernière colonne de l'image. A toi de voir.
Edit : Maintenant que j'y réfléchis, tu peux aussi écrire :
CODE
        even.Create cx+1,cy,cb,src.Density
        even.CopyArea 0,0,cx,cy,src,0,0
        even.CopyArea cx+1,0,1,cy,src,cx,0 ' Code pas testé, sensé recopier la dernière colonne de l'image


Petite remarque : Cette moulinette devient obsolète avec la version 2.5 de HB++, puisque la propriété density d'un bitmap n'est plus en lecture seule. Il suffit donc d'écrire :

CODE
bitmap.density = hbDensityDouble


(et je ne sais pas du tout ce qui se passe si le bitmap avait une largeur impaire dans ce cas. Quelqu'un sait ? huh.gif )
Guy-Lux
Trop de la boulle !!!
Merci beaucoup.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.