OVH Cloud OVH Cloud

questions de graphismes

9 réponses
Avatar
Patrice Henrio
Première question : comment créer un fichier .BMP (ou .JPG, ce serait mieux)
d'une zone rectangulaire de l'écran ? Je veux récupérer cette zone et la
stocker dans un fichier pour qu'elle soit ensuite lue par n'importe quel
éditeur de dessin courant (y compris paint bien sûr).
Deuxième question : est-il possible d'écrire un texte qui suive une courbe
comme le nom des fleuves sur les cartes de géographie ?

Merci de vos réponses.

9 réponses

Avatar
le_troll
Bonjour,

Avec ça tu peux tout faire mais faut pas être pressé:


ECRITURE D'UN PIXEL

Pset(colonne, ligne), Couleur



LECTURE DE LA COULEUR D'UN PIXEL

Couleur = Point(colonne, ligne)


Mais il y a plein d'autre méthodes et plus savant que moi pour en
parler, par exemple:
Vois la méthode "PaintPicture" d'une picture...

A mon sens, pour l'avoir expérimenté, il faut travailler avec des
images, car au pixel en boucle c'est affreusement long... Et dans ce cadre
il est peut être possible d'intégrer des lettres courbes prédéfinies... Vois
ce qu'en diront les autres...

In fine, le fichier "bmp", a priori on peut aire n'importe quel fichier
du moment que l'on reproduit sa structure et notamment son entête, il faut
se renseigner préalablement sur la structure d'un "bmp", c'est sur le Net,
mais bon, t'as du boulot :o)
Pour le "jpg", je ne sais pas si on peut le faire tout de go, ou s'il ne
faut pas passer d'abord par un format non compressé, comme 'bmp', puis
lancer un 'exe' qui transforme en "jpg", idem, tu as plein de doc sur le Net
avec ces formats...

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Ce message est plein de virus "certifiés"
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !
------------------------------------------


"Patrice Henrio" a écrit dans le
message de news:
Première question : comment créer un fichier .BMP (ou .JPG, ce serait


mieux)
d'une zone rectangulaire de l'écran ? Je veux récupérer cette zone et la
stocker dans un fichier pour qu'elle soit ensuite lue par n'importe quel
éditeur de dessin courant (y compris paint bien sûr).
Deuxième question : est-il possible d'écrire un texte qui suive une courbe
comme le nom des fleuves sur les cartes de géographie ?

Merci de vos réponses.




Avatar
Patrice Henrio
Merci pour la réponse, mais ça je sais déjà faire et justement c'est trop
long. on peut récupérer n'importe quelle partie de la mémoire (y compris la
carte graphique donc) et la stocker dans un fichier binaire mais
malheureusement cela ne suffira pas à faire un BitMap. je cherche si des
outils existent déjà.

"le_troll" a écrit dans le message de
news:
Bonjour,

Avec ça tu peux tout faire mais faut pas être pressé:


ECRITURE D'UN PIXEL

Pset(colonne, ligne), Couleur



LECTURE DE LA COULEUR D'UN PIXEL

Couleur = Point(colonne, ligne)


Mais il y a plein d'autre méthodes et plus savant que moi pour en
parler, par exemple:
Vois la méthode "PaintPicture" d'une picture...

A mon sens, pour l'avoir expérimenté, il faut travailler avec des
images, car au pixel en boucle c'est affreusement long... Et dans ce cadre
il est peut être possible d'intégrer des lettres courbes prédéfinies...


Vois
ce qu'en diront les autres...

In fine, le fichier "bmp", a priori on peut aire n'importe quel


fichier
du moment que l'on reproduit sa structure et notamment son entête, il faut
se renseigner préalablement sur la structure d'un "bmp", c'est sur le Net,
mais bon, t'as du boulot :o)
Pour le "jpg", je ne sais pas si on peut le faire tout de go, ou s'il ne
faut pas passer d'abord par un format non compressé, comme 'bmp', puis
lancer un 'exe' qui transforme en "jpg", idem, tu as plein de doc sur le


Net
avec ces formats...

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Ce message est plein de virus "certifiés"
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !
------------------------------------------


"Patrice Henrio" a écrit dans le
message de news:
> Première question : comment créer un fichier .BMP (ou .JPG, ce serait
mieux)
> d'une zone rectangulaire de l'écran ? Je veux récupérer cette zone et la
> stocker dans un fichier pour qu'elle soit ensuite lue par n'importe quel
> éditeur de dessin courant (y compris paint bien sûr).
> Deuxième question : est-il possible d'écrire un texte qui suive une


courbe
> comme le nom des fleuves sur les cartes de géographie ?
>
> Merci de vos réponses.
>
>




Avatar
François Picalausa
Hello,

Tu peux essayer ceci:
Option Explicit

Private Declare Function BitBlt _
Lib "gdi32" _
( _
ByVal hDestDC As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, _
ByVal ySrc As Long, _
ByVal dwRop As Long _
) _
As Long
Private Declare Function GetDC _
Lib "user32" _
( _
ByVal hwnd As Long _
) _
As Long
Private Declare Function ReleaseDC _
Lib "user32" _
( _
ByVal hwnd As Long, _
ByVal hdc As Long _
) _
As Long

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then 'si touche = Enter
SavePicture Me.Image, "c:toto.bmp" 'on sauve l'image au format bmp
End If
Unload Me
End Sub


Private Sub Form_Load()
'DC de l'écran
Dim ScreenDC As Long

'Largeur de l'écran en pixels
Dim ScreenWidth As Long

'Hauteur en pixels
Dim ScreenHeight As Long

ScreenWidth = Screen.Width / Screen.TwipsPerPixelX
ScreenHeight = Screen.Height / Screen.TwipsPerPixelY

'Redimensionne la fenêtre à la taille de l'écran
Me.BorderStyle = 0
Me.Width = Screen.Width
Me.Height = Screen.Height
Me.Top = 0
Me.Left = 0

'Me.WindowState = vbMaximized
'ne fonctionne pas ici...

'Effectue une capture d'écran
DoEvents
ScreenDC = GetDC(0)
Me.AutoRedraw = True
BitBlt Me.hdc, 0, 0, ScreenWidth, ScreenHeight, ScreenDC, 0, 0,
vbSrcCopy
Me.Refresh
ReleaseDC 0, ScreenDC

'Juste pour savoir que c'est un vrai faux
Me.ForeColor = vbRed
Me.Font.Size = 72
Me.Font.Name = "Comic Sans MS"

Me.CurrentX = 0
Me.CurrentY = Me.ScaleHeight - Me.TextHeight("Press any key to
continue...")

Me.Print "Press any key to continue..."
Me.Refresh
End Sub

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Patrice Henrio" a écrit dans le
message de news:
Première question : comment créer un fichier .BMP (ou .JPG, ce serait
mieux) d'une zone rectangulaire de l'écran ? Je veux récupérer cette
zone et la stocker dans un fichier pour qu'elle soit ensuite lue par
n'importe quel éditeur de dessin courant (y compris paint bien sûr).
Deuxième question : est-il possible d'écrire un texte qui suive une
courbe comme le nom des fleuves sur les cartes de géographie ?

Merci de vos réponses.


Avatar
Null
Patrice Henrio wrote:

Première question : comment créer un fichier .BMP (ou .JPG, ce serait mieux)
d'une zone rectangulaire de l'écran ? Je veux récupérer cette zone et la
stocker dans un fichier pour qu'elle soit ensuite lue par n'importe quel
éditeur de dessin courant (y compris paint bien sûr).



Voici une jolie fonction rapide qui fait tout le boulot. Celle-ci prend
une capture de tout l'écran, mais il suffit de modifier les variables
DeskW, DeskH ainsi que le "0, 0" lors de l'appel de BitBlt pour ne
saisire que la zone souhaitée.

Les déclarations nécessaire pour ce code sont plus bas.

Public Function TakeScreenShot(FichierSortie As String) As Single
'Sub tout en un prenant 1 screenshot et l'enregistrant dans FichierSortie
Dim TempDC As Long, TempBMP As Long, lPt As Long
Dim DefDIB As BITMAPINFO
Dim t1 As Single

'capture
DeskW = Screen.Width / 15
DeskH = Screen.Height / 15

TempDC = CreateCompatibleDC(GetDC(0))
DeskDC = GetDC(GetDesktopWindow())

With DefDIB
.bmiHeader.biWidth = DeskW 'largeur
.bmiHeader.biHeight = DeskH 'hauteur
.bmiHeader.biBitCount = 24 'couleurs
.bmiHeader.biPlanes = 1 'nombre de couche de travail
.bmiHeader.biSize = Len(.bmiHeader)
End With

TempBMP = CreateDIBSection(TempDC, DefDIB, 0, lPt, 0, 0)
TempHBITMAP = SelectObject(TempDC, TempBMP)

t1 = Timer
BitBlt TempDC, 0, 0, DeskW, DeskH, DeskDC, 0, 0, vbSrcCopy
TakeScreenShot = Timer - t1

'sauvegarde
Dim BMPID As GUID, BMPHEAP As PicBmp, SCRPTR As IPictureDisp
Dim exeAPI As Long
With BMPID
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
With BMPHEAP
.SIZE = 20
.Type = vbPicTypeBitmap
.hBmp = TempBMP 'Handle de la bitmap
End With
exeAPI = OleCreatePictureIndirect(BMPHEAP, BMPID, 1, SCRPTR)

If Dir(FichierSortie, vbNormal) <> "" Then
t = MsgBox("Le fichier " & FichierSortie & " existe déjà.
Ecraser ?", vbQuestion + vbYesNoCancel, "Capture")
If t = vbYes Then SavePicture SCRPTR, FichierSortie
Else
SavePicture SCRPTR, FichierSortie
End If

DeleteObject TempBMP
DeleteDC TempDC
ReleaseDC GetDesktopWindow(), DeskDC
Set SCRPTR = Nothing

End Function

============================= 'declarations
'certaines sont peut etre inutile
'================================
Private Type BITMAPINFOHEADER
biSize As Long 'Taille en octet du type
biWidth As Long 'x
biHeight As Long 'y
biPlanes As Integer 'Plan (?) défaut=1
biBitCount As Integer 'Bits par pixel (couleurs)
biCompression As Long 'Compression utilisé (défaut=0)
biSizeImage As Long 'Taille de l'image, octet
biXPelsPerMeter As Long 'Résolution (comme le dpi, mais en dpm)
biYPelsPerMeter As Long 'Résolution hauteur
biClrUsed As Long '?
biClrImportant As Long '?
End Type
Private Type RGBQUAD
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
rgbReserved As Byte
End Type
Private Type BITMAPINFO
bmiHeader As BITMAPINFOHEADER 'Définition bitmap
bmiColors As RGBQUAD 'Stockage des couleurs
End Type
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long)
As Long
Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc
As Long) As Long
Private Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long,
ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long,
ByRef lpBits As Any) As Long
Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As
Long
Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As
Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As
Long) As Long
Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long,
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As
Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long,
ByVal dwRop As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long,
ByVal hdc As Long) As Long


Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Private Type PicBmp
SIZE As Long
Type As Long
hBmp As Long
hPal As Long
Reserved As Long
End Type
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll"
(PicDesc As PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long,
IPic As IPicture) As Long


Deuxième question : est-il possible d'écrire un texte qui suive une courbe
comme le nom des fleuves sur les cartes de géographie ?



Désolé ça je sais pas.


Merci de vos réponses.



DR.
Avatar
François Picalausa
Hello,

Parti trop vite...
Je voulais ajouter que la technique est aussi expliquée dans
http://support.microsoft.com/default.aspx?kbid1299

Pour écrire sur une courbe, il n'y a pas de méthode directe. Apparement, il
faut découper la courbe en plusieurs segments , suivant la largeur des
caractères et imprimer ces caractères avec une certaine rotation (déterminée
par le segment).
Tu peux voir à ce sujet:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;154515

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Patrice Henrio" a écrit dans le
message de news:
Deuxième question : est-il possible d'écrire un texte qui suive une
courbe comme le nom des fleuves sur les cartes de géographie ?

Merci de vos réponses.




Avatar
Patrice Henrio
Merci à vous deux, je viens en effet de me pencher sur savePicture mais j'ai
un peu de mal avec l'histoire des autoredraw du contenant et du contenu
(j'ai un pictureBox dans une forme).
Si je veux dessiner dedans que faut-il déclarer pour autoredraw ?

"Null" a écrit dans le message de
news:41111fdc$0$29379$
Patrice Henrio wrote:

> Première question : comment créer un fichier .BMP (ou .JPG, ce serait


mieux)
> d'une zone rectangulaire de l'écran ? Je veux récupérer cette zone et la
> stocker dans un fichier pour qu'elle soit ensuite lue par n'importe quel
> éditeur de dessin courant (y compris paint bien sûr).

Voici une jolie fonction rapide qui fait tout le boulot. Celle-ci prend
une capture de tout l'écran, mais il suffit de modifier les variables
DeskW, DeskH ainsi que le "0, 0" lors de l'appel de BitBlt pour ne
saisire que la zone souhaitée.

Les déclarations nécessaire pour ce code sont plus bas.

Public Function TakeScreenShot(FichierSortie As String) As Single
'Sub tout en un prenant 1 screenshot et l'enregistrant dans FichierSortie
Dim TempDC As Long, TempBMP As Long, lPt As Long
Dim DefDIB As BITMAPINFO
Dim t1 As Single

'capture
DeskW = Screen.Width / 15
DeskH = Screen.Height / 15

TempDC = CreateCompatibleDC(GetDC(0))
DeskDC = GetDC(GetDesktopWindow())

With DefDIB
.bmiHeader.biWidth = DeskW 'largeur
.bmiHeader.biHeight = DeskH 'hauteur
.bmiHeader.biBitCount = 24 'couleurs
.bmiHeader.biPlanes = 1 'nombre de couche de travail
.bmiHeader.biSize = Len(.bmiHeader)
End With

TempBMP = CreateDIBSection(TempDC, DefDIB, 0, lPt, 0, 0)
TempHBITMAP = SelectObject(TempDC, TempBMP)

t1 = Timer
BitBlt TempDC, 0, 0, DeskW, DeskH, DeskDC, 0, 0, vbSrcCopy
TakeScreenShot = Timer - t1

'sauvegarde
Dim BMPID As GUID, BMPHEAP As PicBmp, SCRPTR As IPictureDisp
Dim exeAPI As Long
With BMPID
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
With BMPHEAP
.SIZE = 20
.Type = vbPicTypeBitmap
.hBmp = TempBMP 'Handle de la bitmap
End With
exeAPI = OleCreatePictureIndirect(BMPHEAP, BMPID, 1, SCRPTR)

If Dir(FichierSortie, vbNormal) <> "" Then
t = MsgBox("Le fichier " & FichierSortie & " existe déjà.
Ecraser ?", vbQuestion + vbYesNoCancel, "Capture")
If t = vbYes Then SavePicture SCRPTR, FichierSortie
Else
SavePicture SCRPTR, FichierSortie
End If

DeleteObject TempBMP
DeleteDC TempDC
ReleaseDC GetDesktopWindow(), DeskDC
Set SCRPTR = Nothing

End Function

============================= > 'declarations
'certaines sont peut etre inutile
'================================ >
Private Type BITMAPINFOHEADER
biSize As Long 'Taille en octet du type
biWidth As Long 'x
biHeight As Long 'y
biPlanes As Integer 'Plan (?) défaut=1
biBitCount As Integer 'Bits par pixel (couleurs)
biCompression As Long 'Compression utilisé (défaut=0)
biSizeImage As Long 'Taille de l'image, octet
biXPelsPerMeter As Long 'Résolution (comme le dpi, mais en dpm)
biYPelsPerMeter As Long 'Résolution hauteur
biClrUsed As Long '?
biClrImportant As Long '?
End Type
Private Type RGBQUAD
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
rgbReserved As Byte
End Type
Private Type BITMAPINFO
bmiHeader As BITMAPINFOHEADER 'Définition bitmap
bmiColors As RGBQUAD 'Stockage des couleurs
End Type
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As


Long
Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long)
As Long
Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc
As Long) As Long
Private Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long,
ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long,
ByRef lpBits As Any) As Long
Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As
Long
Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As
Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As
Long) As Long
Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long,
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As
Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long,
ByVal dwRop As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long,
ByVal hdc As Long) As Long


Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Private Type PicBmp
SIZE As Long
Type As Long
hBmp As Long
hPal As Long
Reserved As Long
End Type
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll"
(PicDesc As PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long,
IPic As IPicture) As Long


> Deuxième question : est-il possible d'écrire un texte qui suive une


courbe
> comme le nom des fleuves sur les cartes de géographie ?

Désolé ça je sais pas.

>
> Merci de vos réponses.
>
DR.



Avatar
François Picalausa
Hello,

Autoredraw spécifie si l'objet sur lequel on va peindre gardera en mémoire
les informations.
Si on n'utilise pas d'autoredraw, pour peu que la fenêtre sorte de l'écran
la zone non visible sera effacée.
Donc il s'agit de l'objet sur lequel tu trace, ici la picturebox.
Donc pour form, autoredraw n'a pas d'influence.
Pour picturebox, à true, je suppose.

NB : quand on fait du traçage par APIs avec autoredraw, il faut utiliser
refresh sans quoi la modification n'est pas prise en compte.

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Patrice Henrio" a écrit dans le
message de news:
Merci à vous deux, je viens en effet de me pencher sur savePicture
mais j'ai un peu de mal avec l'histoire des autoredraw du contenant
et du contenu (j'ai un pictureBox dans une forme).
Si je veux dessiner dedans que faut-il déclarer pour autoredraw ?


Avatar
Patrice Henrio
OK c'est le refresh qui me manquait.
"François Picalausa" a écrit dans le message de
news:e%23$
Hello,

Autoredraw spécifie si l'objet sur lequel on va peindre gardera en mémoire
les informations.
Si on n'utilise pas d'autoredraw, pour peu que la fenêtre sorte de l'écran
la zone non visible sera effacée.
Donc il s'agit de l'objet sur lequel tu trace, ici la picturebox.
Donc pour form, autoredraw n'a pas d'influence.
Pour picturebox, à true, je suppose.

NB : quand on fait du traçage par APIs avec autoredraw, il faut utiliser
refresh sans quoi la modification n'est pas prise en compte.

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Patrice Henrio" a écrit dans le
message de news:
> Merci à vous deux, je viens en effet de me pencher sur savePicture
> mais j'ai un peu de mal avec l'histoire des autoredraw du contenant
> et du contenu (j'ai un pictureBox dans une forme).
> Si je veux dessiner dedans que faut-il déclarer pour autoredraw ?




Avatar
Benoit
Salut,

Vas faire un tour sur ce site :
http://www.mvps.org/EDais/Tutorials/index.html
Ce mec est une star du graphisme sous VB. Et ses tutoriaux sont très bien
pour entamer le GDI.

Benoit

"Patrice Henrio" a écrit dans le
message news:
Première question : comment créer un fichier .BMP (ou .JPG, ce serait


mieux)
d'une zone rectangulaire de l'écran ? Je veux récupérer cette zone et la
stocker dans un fichier pour qu'elle soit ensuite lue par n'importe quel
éditeur de dessin courant (y compris paint bien sûr).
Deuxième question : est-il possible d'écrire un texte qui suive une courbe
comme le nom des fleuves sur les cartes de géographie ?

Merci de vos réponses.