ThumbNail - Blir helt knäpp.

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Nson
    Medlem
    • 2001-06-16
    • 149

    #1

    ThumbNail - Blir helt knäpp.

    Har ett jätte probelm. Har skrivit en funktion som skalar om bilder till ett värde (högsta bredd, höjd). Fungerar kalas bra på vissa bilder men vissa bilder blir helt sönder rastade (ser ut som pixlarna är dubbelt så stora).

    Kan nån hjälpa mig och kolla koden. Har kollat på nätet och testat masssor med saker men får inte rätt på det.

    Koden hämtar in bilden från en databas. Och skapar sedan en bild..

    Hjälp

    [KOD]
    Public Function CreateHTTPImage(ByVal sqlvalue As Guid, ByVal imageWidth As Int32, ByVal imageHeight As Int32, ByVal path As String) As Boolean

    Dim sql As New SqlClient.SqlCommand
    sql.CommandText = "SELECT fileBytes, fileData FROM [dbo].[fileserver.data] WHERE fileId = '" & sqlvalue.ToString & "'"
    sql.CommandType = CommandType.Text
    Dim sqlreader As SqlClient.SqlDataReader = db.DataRead(sql)
    sqlreader.Read()
    Dim _image As System.Drawing.Image
    _image = System.Drawing.Image.FromStream(New System.IO.MemoryStream(CType(sqlreader("fileData"), Byte()), 0, CInt(sqlreader("fileBytes"))))

    Dim width As Int32 = imageWidth
    Dim height As Int32 = imageHeight
    Dim imgHeight As Integer = _image.Height
    Dim imgWidth As Integer = _image.Width

    If imgWidth > width Or imgHeight > height Then
    'Determine what dimension is off by more
    Dim deltaWidth As Integer = imgWidth - width
    Dim deltaHeight As Integer = imgHeight - width
    Dim scaleFactor As Double

    If deltaHeight > deltaWidth Then
    'Scale by the height
    scaleFactor = width / imgHeight
    Else
    'Scale by the Width
    scaleFactor = width / imgWidth
    End If

    imgWidth *= scaleFactor
    imgHeight *= scaleFactor
    End If

    ' Skriv till text till bilden.
    Dim bmap As System.Drawing.Image
    bmap = System.Drawing.Image.FromStream(New System.IO.MemoryStream(CType(sqlreader("fileData"), Byte()), 0, CInt(sqlreader("fileBytes"))))

    Dim _newimage As System.Drawing.Image
    _newimage = _image.GetThumbnailImage(imgWidth, imgHeight, Nothing, System.IntPtr.Zero)
    Dim _path As String = "C:\fserver\" + path + sqlvalue.ToString + ".jpg"

    Dim g As Graphics = Graphics.FromImage(_newimage)
    g.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
    g.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality
    g.CompositingQuality = Drawing.Drawing2D.CompositingQuality.HighQuality
    g.CompositingMode = Drawing.Drawing2D.CompositingMode.SourceCopy

    _newimage.Save(_path)
    End Function
    [/KOD]
  • PDahlen
    Medlem
    • 2004-04-10
    • 784

    #2
    Är alla bilder du provar JPEG eller är det GIF bilder som blir konstiga?
    Patrik Dahlén
    -----------------------------------------------------
    Du läser väl min blogg? theswedishcoder.net
    Följ mig på Twitter: twitter.com/patrikdahlen

    Releye AB www.releye.se
    PD Consulting pdc.se
    CV patrik-dahlen.nu

    Comment

    • Nson
      Medlem
      • 2001-06-16
      • 149

      #3
      Det är både och. Det är det som är så konstigt. Vissa bilder i samma serie (samma scanner, samma upplösning) blir knas....

      Som sagt som en pixel förstoring.

      Comment

      • erka
        Medlem
        • 1999-12-27
        • 4597

        #4
        Kan du ta en skärmdump på det så man förstår vad du menar. När du använder GetThumbnailImage på vissa foton tagna med vissa digitalkameror blir det mycket dålig kvalitét pg. av att den gör en thumbnail av thumbnailen som redan är inbakad i bildfilen, men eftersom du hämtar det från en databas här verkar det lite konstigt.

        Comment

        • Nson
          Medlem
          • 2001-06-16
          • 149

          #5
          Här kommer en dump som är okej.
          Attached Files

          Comment

          • Nson
            Medlem
            • 2001-06-16
            • 149

            #6
            Här är en dump som är fel ... Allt genom samma script. Båda bilderna är från samma scanner. Samma inställning... Vad är det som kan gå fel ?
            Attached Files

            Comment

            • erka
              Medlem
              • 1999-12-27
              • 4597

              #7
              Har du provat att använda JpegEncoders ?

              Comment

              • Nson
                Medlem
                • 2001-06-16
                • 149

                #8
                Det tror jag inte...Har det inte med :
                g.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
                g.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality
                g.CompositingQuality = Drawing.Drawing2D.CompositingQuality.HighQuality
                g.CompositingMode = Drawing.Drawing2D.CompositingMode.SourceCopy

                Att göra ?

                Comment

                • renholm
                  Medlem
                  • 2001-04-21
                  • 2048

                  #9
                  _newimage.Save(_path, System.Drawing.Imaging.ImageFormat.Jpeg);

                  Kanske kan vara något om den ska sparas i JPG format.
                  Kristoffer Renholm
                  Netlight Consulting

                  Comment

                  • Nson
                    Medlem
                    • 2001-06-16
                    • 149

                    #10
                    Det har jag testat... Men det blir samma sak! Vissa bilder blir förvrängda... Finns det något annat sätt att scala om bilder, utan att använda Thumb funktionen (om det nu är den som är "skadlig").

                    Mvh NSON
                    Last edited by Nson; 2004-08-13, 06:44.

                    Comment

                    • renholm
                      Medlem
                      • 2001-04-21
                      • 2048

                      #11
                      Använder följande kod för att ändra storlek på bilder (har testat med GIF och JPEG):
                      [kod]
                      public static Bitmap Resize(System.Drawing.Image image, int width, int height)
                      {
                      Bitmap bitmap = new Bitmap(width, height);
                      bitmap.SetResolution(image.HorizontalResolution, image.VerticalResolution);

                      using(Graphics graphics = Graphics.FromImage(bitmap))
                      {
                      graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                      graphics.DrawImage(image, 0, 0, width, height);
                      }
                      return bitmap;
                      }
                      [/kod]

                      Sparar sedan ned bilden till en MemoryStream:
                      [kod]
                      using(Bitmap bitmap = ImageHelper.Resize(image, newwidth, newheight))
                      {
                      bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
                      }
                      [/kod]

                      Bilden skickas sedan direkt till klienten från en HttpHandler:
                      [kod]
                      stream.WriteTo(context.Response.OutputStream);
                      [/kod]
                      Kristoffer Renholm
                      Netlight Consulting

                      Comment

                      • Nson
                        Medlem
                        • 2001-06-16
                        • 149

                        #12
                        Skrev om din kod för att passa in i mitt script;
                        [kod]
                        Dim _newimage As Graphics = Graphics.FromImage(_image)
                        _newimage.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
                        _newimage.DrawImage(_image, 0, 0, imgWidth, imgHeight)

                        Dim bitmap As New Bitmap(imgWidth, imgHeight)
                        bitmap.SetResolution(_image.HorizontalResolution, _image.VerticalResolution)

                        Dim _path As String = "C:\fserver\" + path + sqlvalue.ToString + ".jpg"
                        bitmap.Save(_path, System.Drawing.Imaging.ImageFormat.Jpeg)
                        [/kod]

                        Nu till en fråga; Hur får jag _newimage att skrivas in i bitmap, just nu sparas en helt svart bild... Hjälp

                        Comment

                        • renholm
                          Medlem
                          • 2001-04-21
                          • 2048

                          #13
                          Du missa en del av koden
                          [kod]
                          using(Graphics graphics = Graphics.FromImage(bitmap))
                          {
                          graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                          graphics.DrawImage(image, 0, 0, width, height);
                          }
                          [/kod]
                          Ovanstående bör hantera det efterfrågade. Tyvärr vet jag inte hur man översätter using() till VB.NET men du kan nog utelämna den delen vid test.
                          Kristoffer Renholm
                          Netlight Consulting

                          Comment

                          • Nson
                            Medlem
                            • 2001-06-16
                            • 149

                            #14
                            Efter mycket petande och påtande kom jag fram till denna kod, som fungerar utan problem. De bilder som blev dåliga innan blir det inte längre ialla fall. Får väl se hur länge det håller i sig
                            [kod]
                            Dim _newimage As System.Drawing.Image = System.Drawing.Image.FromStream(New System.IO.MemoryStream(CType(sqlreader("fileData"), Byte()), 0, CInt(sqlreader("fileBytes"))))

                            Dim Bitmap As New Bitmap(_newimage, imgWidth, imgHeight)
                            Bitmap.SetResolution(_image.HorizontalResolution, _image.VerticalResolution)

                            Dim _path As String = "C:\fserver\" + path + sqlvalue.ToString + ".jpg"
                            bitmap.Save(_path, System.Drawing.Imaging.ImageFormat.Jpeg)
                            [/kod]

                            Comment

                            Working...