Avatar billede madssch Nybegynder
06. april 2006 - 14:05 Der er 16 kommentarer og
1 løsning

Resize image

Hej Eksperter.

Her er en bid af min applikation, som gerne skulle kunne resize billeder:


Private Sub ButtonCompress_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonCompress.Click

objImage = System.Drawing.Image.FromFile(FileName_Open)

GetSize()

objImage.GetThumbnailImage(NewWidth, NewHeight, Nothing, inp)
objImage.Save(FileName_Save)

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.

Hvad gør jeg galt?

På forhånd tak!
Avatar billede bernhof Nybegynder
06. april 2006 - 17:48 #1
Jeg mener vistnok, at GetThumbnailImage returerer det resized billede, hvilket vil sige at linien skal se således ud:

objImage = objImage.GetThumbnailImage(NewWidth, NewHeight, Nothing, inp)
Avatar billede madssch Nybegynder
07. april 2006 - 09:05 #2
Så sker der i hvert fald noget.

Tak for hjælpen.

Smid et svar...
Avatar billede madssch Nybegynder
07. april 2006 - 09:24 #3
Findes der andre måder at komprimere billeder på?

Lavede en resize fra 1800x1350 til 200x150. Det forløb i sig selv fint, men billedet fyldte efterfølgende 93kb!

Ikke særlig velegnet til web i hvert fald...
Avatar billede madssch Nybegynder
07. juni 2006 - 10:29 #4
Ingen hjælp hér..?
Avatar billede bernhof Nybegynder
08. juni 2006 - 10:14 #5
Hej - sorry jeg ikke lige har kigget forbi i noget tid. Af en eller anden grund har jeg ikke fået tilsendt mails om dette spm.

Jeg kan lige undersøge dit problem nærmere. Jeg vender tilbage :)
Avatar billede bernhof Nybegynder
08. juni 2006 - 12:05 #6
Hvilket format gemmer du i? Gif? Jpg?

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.
Avatar billede madssch Nybegynder
09. juni 2006 - 09:00 #7
Desværre...

Havde et billede på et par mb's. Brugte den metode du foreslog til at komprimere det til 200x150px.

Komprimering gik stadig uden problemer, men billedet fylder 94kb!
Avatar billede bernhof Nybegynder
09. juni 2006 - 11:17 #8
Med hvilke formater har du forsøgt? Og hvor meget fylder de hver især?
Avatar billede madssch Nybegynder
09. juni 2006 - 11:44 #9
Gif og Jpg.

Husker ikke hvad Gif'en fyldte, men Jpg'en fyldte som sagt de 94kb.

Det var et billede med relativt mange farver og detaljer, så en Gif ville højst sandsynligt have fyldt en del mere...
Avatar billede bernhof Nybegynder
13. juni 2006 - 11:00 #10
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.

Hvilken version af .NET benytter du?
Avatar billede madssch Nybegynder
13. juni 2006 - 11:21 #11
Tænker du på framework er det 2.0.
Avatar billede bernhof Nybegynder
13. juni 2006 - 17:12 #12
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):


  SaveCompressedJPEG(objImage, "C:\billede.jpg", 50)


Jeg lærte selv noget her, og faktisk noget særdeles brugbart :o)
Avatar billede madssch Nybegynder
14. juni 2006 - 09:23 #13
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.

Vil du have mine 200 linjer at tygge på..?  :)
Avatar billede bernhof Nybegynder
15. juni 2006 - 16:36 #14
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 :)
Avatar billede bernhof Nybegynder
27. juni 2006 - 13:10 #15
Har du fået det til at virke?
Avatar billede madssch Nybegynder
27. juni 2006 - 14:39 #16
Hej bernhof,

Jeg har desværre ikke haft tid til at kigge yderligere på det.

Hvis du har det til at køre, stoler jeg på dig og tildeler dig points. Så må jeg tage fat på det igen ved lejlighed.

Tak for hjælpen!  :)
Avatar billede bernhof Nybegynder
27. juni 2006 - 17:21 #17
Det var så lidt. Håber du finder ud af det.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester