[VB.NET] Fotos verkleinen: gelijke verhouding, toch misvormd

Pagina: 1
Acties:
  • 150 views sinds 30-01-2008

  • The__Virus
  • Registratie: Januari 2005
  • Laatst online: 08:30
Een apart probleem, waar het probleem hem denk ik zit in de dpi van een foto. Even een uitleg:

Ik ben bezig een programma te maken, dat een online fotoalbum moet genereren. Hierbij worden foto's verkleind en in een map geplaatst en bijbehorende HTML-code gebrouwen. Waarom geen bestaande oplossing?
1. Dit is leuker en leerzamer.
2. Ben vaak niet tevreden over de mogelijkheden: je kunt vaak weinig aan de 'templates' sluiten, is of te moeilijk of vaak gewoon niet mogelijk. Dat wordt bij die van mij anders >:)

Nu het probleem: ik verklein de foto's en de verhoudingen in pixels blijven exact gelijk, maar toch is de foto misvormd, hij is in de breedte uitgerekt. Nu denk ik dat dit iets te maken heeft met de dpi, maar ik zou niet weten hoe ik dit veranderen moet.

Ik heb een stukje code voor het veranderen van de grootte van foto's van internet af en heel licht aangepast:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    Public Function SavePhoto(ByVal src As String, ByVal dest As String, ByVal w As Integer) As Boolean
        Dim imgTmp As System.Drawing.Image
        Dim sf As Double
        Dim imgFoto As System.Drawing.Bitmap

        imgTmp = System.Drawing.Image.FromFile(src)
        If imgTmp.Width >= imgTmp.Height Then
            If (imgTmp.Width > w) Then
                sf = imgTmp.Width / w
                imgFoto = New System.Drawing.Bitmap(w, CInt(imgTmp.Height / sf))
                Dim recDest As New Rectangle(0, 0, w, imgFoto.Height)
                Dim gphCrop As Graphics = Graphics.FromImage(imgFoto)
                gphCrop.SmoothingMode = SmoothingMode.HighQuality
                gphCrop.CompositingQuality = CompositingQuality.HighQuality
                gphCrop.InterpolationMode = InterpolationMode.High

                gphCrop.DrawImage(imgTmp, recDest, 0, 0, imgTmp.Width, imgTmp.Height, GraphicsUnit.Pixel)
            Else
                imgFoto = imgTmp
            End If
        End If
        If imgTmp.Width < imgTmp.Height Then
            If (imgTmp.Height > w) Then
                sf = imgTmp.Height / w
                imgFoto = New System.Drawing.Bitmap(CInt(imgTmp.Width / sf), w)
                Dim recDest As New Rectangle(0, 0, imgFoto.Height, w)
                Dim gphCrop As Graphics = Graphics.FromImage(imgFoto)
                gphCrop.SmoothingMode = SmoothingMode.HighQuality
                gphCrop.CompositingQuality = CompositingQuality.HighQuality
                gphCrop.InterpolationMode = InterpolationMode.High

                gphCrop.DrawImage(imgTmp, recDest, 0, 0, imgTmp.Width, imgTmp.Height, GraphicsUnit.Pixel)
            Else
                imgFoto = imgTmp
            End If
        End If
        'Dim myImageCodecInfo As System.Drawing.Imaging.ImageCodecInfo
        Dim myEncoder As System.Drawing.Imaging.Encoder
        Dim myEncoderParameter As System.Drawing.Imaging.EncoderParameter
        Dim myEncoderParameters As System.Drawing.Imaging.EncoderParameters

        Dim arrayICI() As System.Drawing.Imaging.ImageCodecInfo = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()
        Dim jpegICI As System.Drawing.Imaging.ImageCodecInfo = Nothing
        Dim x As Integer = 0
        For x = 0 To arrayICI.Length - 1
            If (arrayICI(x).FormatDescription.Equals("JPEG")) Then
                jpegICI = arrayICI(x)
                Exit For
            End If
        Next
        myEncoder = System.Drawing.Imaging.Encoder.Quality
        myEncoderParameters = New System.Drawing.Imaging.EncoderParameters(1)
        myEncoderParameter = New System.Drawing.Imaging.EncoderParameter(myEncoder, 90)
        myEncoderParameters.Param(0) = myEncoderParameter
        imgFoto.Save(dest, jpegICI, myEncoderParameters)
        imgFoto.Dispose()
        imgTmp.Dispose()
        Return True
    End Function

Het werkt allemaal prima, op de verhoudingen na. Je kunt aan onderstaande foto's zien dat ze zijn 'ingedrukt':
Afbeeldingslocatie: http://home.planet.nl/~schui798/1.jpgAfbeeldingslocatie: http://home.planet.nl/~schui798/2.jpg

Iemand een oplossing? ;(

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 13-10-2025

MrSleeves

You'll thank me later.

In regel 10 maak je een bitmap aan met formaat (w, CInt(imgTmp.Height / sf)).
In regel 11 maak je een rectangle aan met formaat (w, imgFoto.Height), die je gebruikt als destination. Daar gaat het mis denk ik.

In regel 25 en 26 hetzelfde verhaal; daar klopt ook het één en ander niet.

Zelf ga ik altijd uit van een maximale rectangle als basis (in plaats van de variabele w) en daarin probeer ik dan de beste maat te plaatsen van de originele bitmap.

Overigens kan je ook nog een thumbnail van een bitmap krijgen met GetThumbnailImage; alleen niet iedere programma wijzigt de ingebouwde thumbnail.

[ Voor 51% gewijzigd door MrSleeves op 07-08-2007 14:05 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • The__Virus
  • Registratie: Januari 2005
  • Laatst online: 08:30
GetThumbnailImage werkt dus niet correct: bij een JPEG wordt vaak een thumbnail door de camera ingebouwd en die wordt dan gebruikt. Bij grote afbeeldingen krijg je dus het effect van een kleine afbeelding opblazen. Dat is te omzeilen door de foto 2x in te laden en er dan een thumbnail van te maken, maar dat is niet erg netjes en bovendien langzaam.

edit:
Het is toch niet fout, het klopt toch gewoon? Want in de eerste geef je die waarde mee aan imgfoto en in de tweede gebruik je die, dus het zou moeten kloppen toch? Want dan zou het aantal pixels volgens mij ook niet moeten kloppen.

[ Voor 24% gewijzigd door The__Virus op 07-08-2007 14:34 ]


  • Adion
  • Registratie: Januari 2001
  • Laatst online: 08:29
Op regel 26 moet het volgens mij toch wel degelijk imgFoto.Width zijn ipv imgFoto.Height

Qua naamgeving had ik trouwens ook imgTmp zelf imgSrc ofzo genoemd, dat zegt toch iets meer en maakt de code wat leesbaarder.

VirtualDJ 2026 - Fast Image Resizer - Instagram


  • The__Virus
  • Registratie: Januari 2005
  • Laatst online: 08:30
Regel 26 is inderdaad fout zie ik nu, want ik merk nu dat het alleen bij 'staande' foto's gebeurt en dat is juist hetgeen wat ik heb aangepast in de code. Wat er gebeurt is dat er een stuk van de zijkant wordt afgehaald en de rest wordt uitgerekt daarover.

En tja ik heb de code gedownload dus de leesbaarheid ligt niet aan mij :P (lekker makkelijk :+). Ik heb het veranderd en nu klopt het, bedankt!

[ Voor 4% gewijzigd door The__Virus op 07-08-2007 14:51 ]


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 13-10-2025

MrSleeves

You'll thank me later.

The__Virus schreef op dinsdag 07 augustus 2007 @ 14:32:
edit:
Het is toch niet fout, het klopt toch gewoon? Want in de eerste geef je die waarde mee aan imgfoto en in de tweede gebruik je die, dus het zou moeten kloppen toch? Want dan zou het aantal pixels volgens mij ook niet moeten kloppen.
Ja, ik zie het; ik las verkeerd.

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:31

Creepy

Tactical Espionage Splatterer

No offence, maar het is hier geen supportforum voor code van anderen. Voor support op gedownloade code zul je toch echt bij de maker van dat stukje code moeten zijn. Hier in PRG draait het om zelf geschreven code.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.