Compresser une image

Signaler
Messages postés
9
Date d'inscription
mercredi 6 août 2014
Statut
Membre
Dernière intervention
28 décembre 2014
-
Messages postés
15399
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 janvier 2021
-
Bonjour je fais un programme qui prend plusieur image à la suite le seul problème est que les images sont trop volumineuse , donc je voudrais savoir comment compresser une bitmap pour la rendre moins volumineuse. Merci de répondre au plus vite ;D
Dim bob As Integer = 0
Dim images(bob) As Bitmap

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        Dim bounds As Rectangle
        Dim screenshot As System.Drawing.Bitmap
        Dim graph As Graphics
        bounds = Screen.PrimaryScreen.Bounds
        screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
        graph = Graphics.FromImage(screenshot)
        graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
        ReDim Preserve images(bob)
        images(bob) = screenshot
        bob = bob + 1

    End Sub

5 réponses

Messages postés
14757
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
14 janvier 2021
151
Tout dépend du type d'image, mais tu peux enregistrer en PNG (pas de perte, mais peu adapté aux photos, mais parfait pour des images avec peu de couleurs différentes), Jpeg (avec perte, mais très adapté aux photos).

If a Dalek is a being of pure hate...what happens when Cadence uses her love spell on one?
En VB.NET pensez à activer "Option Explicit" et "Option Strict"
Messages postés
9
Date d'inscription
mercredi 6 août 2014
Statut
Membre
Dernière intervention
28 décembre 2014

merci de ta réponse mais comment les mettre Jpeg car il me les mais en bmp?
Messages postés
15399
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 janvier 2021
501
Bonjour,
utiliser un tableau que tu redimmensionnes à chaque boucle est gourmand en temps et en ressource.
Il est plus judicieux d'utiliser une liste.

tu remplaces
Dim images(bob) As Bitmap

par
Dim image As List(Of Bitmap)


et
ReDim Preserve images(bob)
images(bob) = screenshot
bob = bob + 1

par
image.Add(screeshot)


et à priori tu n'as plus besoin de bob.
tu peux récupérer le nombre d'enregistrement avec
image.Count


Pour le png ou le jpeg c'est au moment de l'enregistrement que tu choisis le format.
screenshot.Save("c:\temp\image.png", System.Drawing.Imaging.ImageFormat.Png)
Messages postés
9
Date d'inscription
mercredi 6 août 2014
Statut
Membre
Dernière intervention
28 décembre 2014

Merci de ta réponse mais il y a un problème quand je remplace
Redim Preserve images(bob)
Images (bob) = screenshot
bob = bob + 1
Par
Image.Add(screenshot)
Sa me dit que Add n'est pas un membre de système.Drawing.Image
Messages postés
15399
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 janvier 2021
501
pardon erreur de frappe:
images.Add(screeshot)
Messages postés
15399
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 janvier 2021
501
Si tu n'enregistres pas les images sur le disque je ne connais pas de solution
Messages postés
9
Date d'inscription
mercredi 6 août 2014
Statut
Membre
Dernière intervention
28 décembre 2014

ok merci quand même ;D
Messages postés
15399
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 janvier 2021
501
Ça n'empêche que l'utilisation de la liste à la place du tableau optimisera ton programme.
Messages postés
9
Date d'inscription
mercredi 6 août 2014
Statut
Membre
Dernière intervention
28 décembre 2014

Donc j'ai utilisé la liste à la place du tableau mais il y a une erreur
ReDim imagestext(UBound(images)) 'ici
For i = 0 To UBound(imagestext)
imagestext(i) = BitmapToString(images(i))
où il y a images sa me dit Impossible de convertir une valeur de type 'System.Collections.Generic.List(Of System.Drawing.Bitmap)' en 'System.Array'
Et quand je lance quand même le programme il y a une autre erreur c'est
 images.Add(screenshot)
et sa me dit que La référence d'objet n'est pas définie à une instance d'un objet
Messages postés
15399
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 janvier 2021
501
Ben oui, je t'ai dit qu'une liste ça ne se redim pas, et que pour en avoir le nombre d'entrée ça n'est pas ubound, mais .count
Messages postés
15399
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 janvier 2021
501
Et pour
images.Add(screenshot)
, si aucune image n'a été prise, tu ne pourras pas l'ajouter à la liste, et ça aurait été pareil avec le tableua
Messages postés
9
Date d'inscription
mercredi 6 août 2014
Statut
Membre
Dernière intervention
28 décembre 2014

;D et moi j'ai oublié de dire que toute les images je les mettais dans une variable donc le
screenshot.Save("c:\temp\image.png", System.Drawing.Imaging.ImageFormat.Png)
Pour que tu vois mieux le truc je te met tous le code
Imports System.IO
Public Class Form1
Dim bob As Integer = 0
Dim images(bob) As Bitmap
Dim imagestext(bob) As String
Public bla As String

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
Dim bounds As Rectangle
Dim screenshot As System.Drawing.Bitmap
Dim graph As Graphics
bounds = Screen.PrimaryScreen.Bounds
screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
graph = Graphics.FromImage(screenshot)
graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
ReDim Preserve images(bob)
images(bob) = screenshot
bob = bob + 1


End Sub

Private Sub Record_Click(sender As System.Object, e As System.EventArgs) Handles Record.Click

Timer1.Enabled = True
Stopp.Enabled = True
Record.Enabled = False

End Sub

Private Sub Stopp_Click(sender As System.Object, e As System.EventArgs) Handles Stopp.Click
Timer1.Enabled = False
Stopp.Enabled = False
Record.Enabled = True

ReDim imagestext(UBound(images))
For i = 0 To UBound(imagestext)
imagestext(i) = BitmapToString(images(i))

Next
bla = String.Join("blob", imagestext)

Enregistrer.Show()


End Sub

Private Sub LireToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles LireToolStripMenuItem.Click
Form2.Show()
End Sub
End Class
Il y a 2 fonction,une pour transformer les bitmap en string et l'autre pour transformer les string en bitmap,mais c un amie qui me les a passé donc je sais pas si je peut les mettre ;D