webForumDet fria alternativet

ThumbNail - Blir helt knäpp.

.NETur .NET

13 svar · 670 visningar · startad av Nson

Medlem sedan juni 2001145 inlägg
Frågan#1

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 ;)

   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
Medlem sedan apr. 2004778 inlägg
#2

Är alla bilder du provar JPEG eller är det GIF bilder som blir konstiga?

Medlem sedan juni 2001145 inlägg
#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.

Medlem sedan dec. 19996 522 inlägg
#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.

Medlem sedan juni 2001145 inlägg
#5

Här kommer en dump som är okej.

dump2.jpg
Medlem sedan juni 2001145 inlägg
#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 ?

dump1.jpg
Medlem sedan dec. 19996 522 inlägg
#7

Har du provat att använda JpegEncoders ?

Medlem sedan juni 2001145 inlägg
#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 ?

Medlem sedan apr. 20012 266 inlägg
#9

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

Kanske kan vara något om den ska sparas i JPG format.

Medlem sedan juni 2001145 inlägg
#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

Medlem sedan apr. 20012 266 inlägg
#11

Använder följande kod för att ändra storlek på bilder (har testat med GIF och JPEG):

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;
}

Sparar sedan ned bilden till en MemoryStream:

using(Bitmap bitmap = ImageHelper.Resize(image, newwidth, newheight))
{
	bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
}

Bilden skickas sedan direkt till klienten från en HttpHandler:

stream.WriteTo(context.Response.OutputStream);
Medlem sedan juni 2001145 inlägg
#12

Skrev om din kod för att passa in i mitt script;

        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)

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

Medlem sedan apr. 20012 266 inlägg
#13

Du missa en del av koden

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

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.

Medlem sedan juni 2001145 inlägg
#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 ;)

       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)
133 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)