MessageBox.Show("Billedet blev komprimeret korrekt", "Status", MessageBoxButtons.OK, MessageBoxIcon.Information)
NewCompression()
End Sub
Mit problem er, at det valgte billede (bliver valgt gennem en OpenFileDialog) godt nok bliver kopieret til den valgte placering (bliver valgt gennem SaveFileDialog), men ikke resized.
Med kunstig intelligens skaber HP’s nye OmniBook X 14 en unik og skræddersyet brugeroplevelse målrettet dem, der ønsker høj ydeevne og intelligente funktioner
Følgende er blot et gæt, men måske hjælper det. Prøv at definere et nyt billede (objImage2) af samme størrelse som det resized billede (objImage), og tegn det resized billede på det nye således:
Dim objImage2 As New Bitmap(200, 150) Dim gr As Graphics = Graphics.FromImage(objImage2) gr.DrawImage(objImage, 0, 0)
Gem herefter objImage2 til en fil og se hvor meget det fylder. Prøv både med gif og jpg og se hvilke resultater du får.
Ok, ja. Netop. For hvis det var gif'en der fyldte de 94, ville jeg bedre kunne forstå det. Jeg tror måske det kan have noget at gøre med, at paletten ikke bliver opdateret til kun at indeholde de nødvendige farver, men det er rent gætværk fra min side.
Jeg må lige kigge lidt nærmere på det, og se om jeg kan finde en løsning.
Ah, har fundet løsningen. Det er selvfølgelig compression, der er tale om. Som udgangspunkt laver .NET vist ingen compression, men med følgende kode kan du angive, i hvilken kvalitet JPG-billedet skal gemmes (og derved også filstørrelsen).
Disse to første rutiner skal placeres et sted i din kode (husk at importere namespacet System.Drawing.Imaging):
Public Function FindEncoder(ByVal pImageFormat As ImageFormat) As ImageCodecInfo 'Benyttes til en finde en encoder ud fra et givent format: Dim lCodecInfos() As ImageCodecInfo lCodecInfos = ImageCodecInfo.GetImageEncoders For Each lCodecInfo As ImageCodecInfo In lCodecInfos If lCodecInfo.FormatID = pImageFormat.Guid Then Return lCodecInfo End If Next Return Nothing End Function
Public Sub SaveCompressedJPEG(ByVal pImage As Image, _ ByVal pFileName As String, _ ByVal pQuality As Int32) 'Find JPEG-encoder: Dim lEncoder As ImageCodecInfo = FindEncoder(ImageFormat.Jpeg) 'Tilføj quality-parameter: Dim lParams As EncoderParameters = New EncoderParameters(1) lParams.Param(0) = New EncoderParameter(Encoder.Quality, pQuality) 'Gem billede til fil: pImage.Save(pFileName, lEncoder, lParams) End Sub
Herefter kan du nu skrive denne ene linie for at gemme et JPG-billede med en kvalitetsfaktor fra 1-100 (1 er laveste kvalitet, 100 er højeste kvalitet):
Det ser meget lovende ud - jeg får det vist bare ikke integreret rigtigt. Her er hvad jeg gør:
1. Importerer System.Drawing.Imaging 2. Indsætter de 2 Sub's. 3. Kalder SaveCompressedJPEG(objImage, "C:\billede.jpg", 50) fra den Sub som p.t. står for komprimering.
Når jeg så kører programmet, sker der ingen komprimering.
Hmm, det undrer mig. Jeg tager et 1920 x 1200, laver en thumbnail med størrelsen 200 x 150 og benytter fx kvalitet 10:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim lImg As Image = Image.FromFile("C:\music.jpg") lImg = lImg.GetThumbnailImage(200, 150, Nothing, IntPtr.Zero) SaveCompressedJPEG(lImg, "C:\music_thumb.jpg", 10) End Sub
Det giver en voldsom komprimering, og billedet ender med kun at fylde 1,44 Kb! Hvis du ikke umiddelbart kan se, om du gør noget anderledes, så kan vi jo blive nødt til at tage fat i dine 200 linier kode :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.