MoiOlivier
Messages postés172Date d'inscriptionmardi 15 juillet 2003StatutMembreDernière intervention 4 août 2005
-
15 janv. 2005 à 11:33
MoiOlivier
Messages postés172Date d'inscriptionmardi 15 juillet 2003StatutMembreDernière intervention 4 août 2005
-
16 janv. 2005 à 11:52
Bonjour à tous,
Voilà mon problème : il faut que je puisse créer des images de très haute résolution, malheureusement, au-delà d'une certaine taille le PictureBox me pose des problèmes (aux alentours de 3800 x 3800 pixels).
Pour dessiner dans le picturebox, j'utilise l'api setdibits, là, pas de problème, le tableau de bits peut prendre presque n'importe quelle taille, alors, comme le picturebox a l'air d'être limité, je me demandais s'il y avait moyen d'enregistrer l'image sur le disque directement à partir de ce tableau sans passer par un picturebox.
Un truc du genre SaveDIBitsAsBitmap(Tableau, "path")...
Si ce n'est pas clair, dites-le moi, je préciserai un peu.
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 15 janv. 2005 à 12:46
Cela est possible en enregistrant directement dans le format bitmap,
donc il te faut connaitre le header du fichier bitmap, l'enregistrer
dans le fichier, puis y enregistrer ton tableau de bits.
Voir ma source d'éditeur d'icône pour voir comment ca marche pour un .ico (c'est le même principe pour un .bmp)
DarK Sidious
[Administrateur et responsable VB/API du site ProgOtoP]
MoiOlivier
Messages postés172Date d'inscriptionmardi 15 juillet 2003StatutMembreDernière intervention 4 août 2005 16 janv. 2005 à 11:31
Salut,
Merci d'avoir répondu, c'est bien ce que je craignais...
C'est donc ce que j'ai fait, mais le bmp ainsi enregistré ne peut pas être ouvert avec n'importe quoi...
L'apperçu Windows fonctionne, la fonction LoadPicture de VB fonctionne, ACDSee fonctionne...
Par contre, Photoshop ne veut rien savoir (!!) et Microsoft Photo Editor non plus...
Je place ici le code que j'utilise (c'est un peu long), si quelqu'un trouve ce qui est incompatible avec certains prog, il sera béni pour les 8 générations à venir.
Déclaration des types :
Private Type Btmp
Sig As String * 2
Size As Long
Res1 As Integer
Res2 As Integer
Offset As Long
End Type
Private Type BITMAPINFOHEADER
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Private Type RGBQUAD
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
rgbReserved As Byte 'PS : si quelqu'un sait à quoi ça sert, je suis preneur
End Type
Déclaration des variables :
Dim BMPINFOH As BITMAPINFOHEADER
Dim Bmp As Btmp
Private Buffer() As RGBQUAD
Private Larg As Long 'largeur de l'image
Private Haut As Long 'hauteur
Code de la fonction pour enregistrer l'image :
Tail = (Larg + 1) * (Haut + 1) * 4
With BMPINFOH
.biBitCount = 32
.biHeight = Haut + 1
.biWidth = Larg + 1
.biPlanes = 1
.biSize = Len(BMPINFOH)
.biClrImportant = 0
.biClrUsed = 0
.biCompression = 0
.biSizeImage = Tail
.biXPelsPerMeter = 100
.biYPelsPerMeter = 100
End With
With Bmp
.Offset = Len(Bmp) + Len(BMPINFOH)
.Sig = "BM"
.Size = .Offset + Tail
End With
f = FreeFile
Open Path For Binary As f
Put f, , Bmp.Sig
Put f, , Bmp.Size
Put f, , Bmp.Res1
Put f, , Bmp.Res2
Put f, , Bmp.Offset
Put f, , BMPINFOH.biSize
Put f, , BMPINFOH.biWidth
Put f, , BMPINFOH.biHeight
Put f, , BMPINFOH.biPlanes
Put f, , BMPINFOH.biBitCount
Put f, , BMPINFOH.biCompression
Put f, , BMPINFOH.biSizeImage
Put f, , BMPINFOH.biXPelsPerMeter
Put f, , BMPINFOH.biYPelsPerMeter
Put f, , BMPINFOH.biClrUsed
Put f, , BMPINFOH.biClrImportant
Put f, , Buffer
Close f
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 16 janv. 2005 à 11:40
Alors, faisons dans l'ordre :
Private Type RGBQUAD
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
rgbReserved As Byte 'PS
: si quelqu'un sait à quoi ça sert, je suis preneur
End Type
Il me semble que ca sert à coder les niveaux de transparence pour des images en 32 bits.
With BMPINFOH
.biBitCount = 32
Essaye plutôt de mettre 24 pour une image 24
bits, car si tu mets 32 bits, il faut que ton tableau de bits code
chaque pixels sur 4 octets et non sur 3 ! Ca vient peut-être de là !
Toujours est-il que si certains logiciels n'arrive par à lire ton
fichier, c'est que l'en-tête enregistré ne correspond pas au format
réellement utilisé pour enregistrer ton bitmap !
DarK Sidious
[Administrateur et responsable VB/API du site ProgOtoP]
MoiOlivier
Messages postés172Date d'inscriptionmardi 15 juillet 2003StatutMembreDernière intervention 4 août 2005 16 janv. 2005 à 11:52
Wow, rapide comme réponse, merci.
Mais, justement, j'utilise le type RGBQuad (composé de 4 octets) pour remplir mon tableau, donc le biBitCount doit être mis à 32.
Sur ce, tu as probablement raison, ça doit venir du format de l'en-tête (celui que j'utilise est le plus simple possible que j'ai trouvé sur le net, dans les msdn, il y est décrit comme vachement plus compliqué).
Mais j'ai remarqué un truc qui me permet de contourner le problème :
Je ne peux pas dessiner dans un PictureBox de taille importante, donc j'enregistre l'image dans "mon" format direct sans l'afficher. Or une fois enregistrée comme ça, je peux charger cette image dans un picturebox avec LoadPicture (étrange quand même), alors, à partir de là, je peux la réenregistrer avec SavePicture. Du coup, le bmp est parfaitement compatible avec tout... Ca prend plus de temps, mais bon c'est pas trop grave (1 min en plus... Quand on sait que pour calculer l'image, il faut environ 25 min à mon prog, c'est pas la mort)