Compresser une image

blob380 Messages postés 9 Date d'inscription mercredi 6 août 2014 Statut Membre Dernière intervention 28 décembre 2014 - 7 août 2014 à 00:13
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 9 août 2014 à 00:20
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

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
Modifié par NHenry le 7/08/2014 à 01:18
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"
1
blob380 Messages postés 9 Date d'inscription mercredi 6 août 2014 Statut Membre Dernière intervention 28 décembre 2014
7 août 2014 à 15:22
merci de ta réponse mais comment les mettre Jpeg car il me les mais en bmp?
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
7 août 2014 à 15:59
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)
1
blob380 Messages postés 9 Date d'inscription mercredi 6 août 2014 Statut Membre Dernière intervention 28 décembre 2014
7 août 2014 à 19:00
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
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
7 août 2014 à 19:23
pardon erreur de frappe:
images.Add(screeshot)
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
7 août 2014 à 20:32
Si tu n'enregistres pas les images sur le disque je ne connais pas de solution
1
blob380 Messages postés 9 Date d'inscription mercredi 6 août 2014 Statut Membre Dernière intervention 28 décembre 2014
7 août 2014 à 20:39
ok merci quand même ;D
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
7 août 2014 à 20:50
Ça n'empêche que l'utilisation de la liste à la place du tableau optimisera ton programme.
1
blob380 Messages postés 9 Date d'inscription mercredi 6 août 2014 Statut Membre Dernière intervention 28 décembre 2014
8 août 2014 à 20:59
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
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
9 août 2014 à 00:17
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
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
9 août 2014 à 00:20
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
blob380 Messages postés 9 Date d'inscription mercredi 6 août 2014 Statut Membre Dernière intervention 28 décembre 2014
7 août 2014 à 20:04
;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
0
Rejoignez-nous