FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Medlem
|
Hej!
Jag skulle behöva tips och råd hur jag kan förbättra thumbnail-bilder på www.ergona.se/sortiment.aspx Uppladdning är gjord nu så att man bara laddar upp en bild som skalas ner i 2 mindre storlkar. Problemet är att bilderna blir taggiga och inte ser bra ut. Hur kan jag bäst lösa detta problemet utan att användaren behöver ladda upp alla bilder igen? Exempel på sådana lösningar? /E |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Nykomling
|
Uppenbarligen så är det din kod som skalar ner bilderna som behöver justeras. Sen så har du ju orginalbilden i din lightbox för varje produkt. Bara att göra ett script som loopar igenom alla produkter och skalar om samt ersätter nuvarande thumbnails.
Du kan ju visa din kod om du har lust |
||
![]() |
![]() |
![]() |
#3 | |||
|
||||
Klarade millennium-buggen
|
Det finns ett större antal parametrar för att ställa in kvalitet på alla transformationer man gör. Exempelvis:
Kod:
myGraphicObject.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear; Kod:
System.Drawing.Imaging.ImageCodecInfo JpegICI = null; System.Drawing.Imaging.EncoderParameters objEncoderParameters = new System.Drawing.Imaging.EncoderParameters(); System.Drawing.Imaging.EncoderParameter objEncoderParameter = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100); objEncoderParameters.Param[0] = objEncoderParameter; for (int i = 0; i <= objImageCodecInfo.Length - 1; i++) { if (objImageCodecInfo[i].FormatDescription.Equals("JPEG")) { JpegICI = objImageCodecInfo[i]; break; } } myBitmap.Save("filnamn.jpg", JpegICI, objEncoderParameters); |
|||
![]() |
![]() |
![]() |
#4 | |||
|
||||
Flitig postare
|
Beroende på hur du skapar thumbnails (skalar de stora bilderna först sen skapar mindre av dessa) så kan det påverka.
Det finns en "bugg" i .net 2.0 som gör att när man använder getThumbnail så använder systemet bildens EXIF Thumbnail som finns och skala om denna, om man då vill skala upp en bild så blir den dålig. |
|||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Klarade millennium-buggen
|
Håller med Frej. Att skriva en "egen" resize tar väl max 3 rader kod beroende på dina krav.
|
|||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Medlem
|
Tack för alla tipsen, kan du ge exempel på hur jag skulle kunna
skriva en resize med så lite kod som möjligt? Har kämpat igenom tutorials med väldigt massa information.... Tack! |
||
![]() |
![]() |
![]() |
#7 | |||
|
||||
Flitig postare
|
Här har du en färdig klass jag skrivit för länge sedan, dock i vb.net men du kan ju skriva om den. Det finns lite fler funktioner som rotation osv, samt hanterar fulhackar buggen jag skrev om tidigare genom att göra en dubbelrotation på 90 grader, då "förstörs" exif-datat och getThumbnail tar från orginalet. Anyway det var ett tag sedan denna skrevs. Men du har något att gå på iaf
Kod:
Imports Microsoft.VisualBasic Imports System Imports System.Drawing Imports System.Drawing.Imaging Imports System.Drawing.Image Imports System.IO Imports System.Text Namespace Image.Edit * *Public Structure CropType * * * *Public Height As String * * * *Public Width As String * *End Structure * *Public Structure ResizeType * * * *Public Height As String * * * *Public Width As String * *End Structure * *Public Structure RotateType * * * *Public Degrees As String * *End Structure * *Public Class ImageTransform * * * *Public Crop As CropType * * * *Public Resize As ResizeType * * * *Public Rotate As RotateType * *End Class * *Public Class Edit * * * *Public _pathOutputImage As String * * * *Public imgTrans As ImageTransform * * * *Public _inputImage As Drawing.Image * * * *Public _strFileName As String * * * *Private _inputImagePath As String * * * *Public myBitmap As Bitmap * * * *Public myImageCodecInfo As Imaging.ImageCodecInfo * * * *Public myEncoder As Imaging.Encoder * * * *Public myEncoderParameter As Imaging.EncoderParameter * * * *Public myEncoderParameters As Imaging.EncoderParameters * * * *Public Log As StringBuilder * * * *ReadOnly Property Height() As String * * * * * *Get * * * * * * * *Return _inputImage.Height * * * * * *End Get * * * *End Property * * * *ReadOnly Property GetLof() As String * * * * * *Get * * * * * * * *Return Log.ToString * * * * * *End Get * * * *End Property * * * *ReadOnly Property Width() As String * * * * * *Get * * * * * * * *Return _inputImage.Width * * * * * *End Get * * * *End Property * * * *Public Sub New(ByVal ImagePath As String) * * * * * *Try * * * * * * * *_inputImagePath = ImagePath * * * * * * * *_inputImage = Drawing.Image.FromFile(_inputImagePath) * * * * * * * *_pathOutputImage = _inputImagePath * * * * * * * *Log = New StringBuilder() * * * * * *Catch er As Exception * * * * * * * *Throw er * * * * * *End Try * * * *End Sub * * * *Public Sub FileName(ByVal strFileName As String) * * * * * *_strFileName = strFileName * * * *End Sub * * * *Private Function getRandomName() As String * * * * * *Dim fi As New FileInfo(_inputImagePath) * * * * * *Return fi.DirectoryName & "\" & _strFileName * * * *End Function * * * *Public Function Transform(ByVal XMLFile As String) * * * * * *Dim reader As New System.Xml.Serialization.XmlSerializer(GetType(ImageTransform)) * * * * * *Dim file As New System.IO.StreamReader(XMLFile) * * * * * *imgTrans = reader.Deserialize(file) * * * * * *file.Close() * * * * * *'resize * * * * * *If Not imgTrans.Resize.Height Is Nothing Then * * * * * * * *Resize(imgTrans.Resize.Height.ToString, imgTrans.Resize.Width.ToString) * * * * * *End If * * * * * *'crop * * * * * *If Not imgTrans.Crop.Height Is Nothing Then * * * * * * * *Crop(imgTrans.Crop.Height.ToString, imgTrans.Crop.Width.ToString) * * * * * *End If * * * * * *'rotate * * * * * *If Not imgTrans.Rotate.Degrees Is Nothing Then * * * * * * * *Rotate(imgTrans.Rotate.Degrees) * * * * * *End If * * * *End Function * * * *Public Function Crop(ByVal Height As String, ByVal Width As String) * * * * * *_pathOutputImage = getRandomName() * * * * * *Dim bmpImage As Bitmap * * * * * *Dim recCrop As Rectangle * * * * * *Dim bmpCrop As Bitmap * * * * * *Dim gphCrop As Graphics * * * * * *Dim recDest As Rectangle * * * * * *Try * * * * * * * *TakeNote("Crop " & Height & " x " & Width) * * * * * * * *bmpImage = New Bitmap(_inputImage) * * * * * * * *recCrop = New Rectangle(0, 0, Width, Height) * * * * * * * *bmpCrop = New Bitmap(recCrop.Width, recCrop.Height, bmpImage.PixelFormat) * * * * * * * *gphCrop = Graphics.FromImage(bmpCrop) * * * * * * * *recDest = New Rectangle(0, 0, Width, Height) * * * * * * * *gphCrop.DrawImage(bmpImage, recDest, recCrop.X, recCrop.Y, recCrop.Width, _ * * * * * * * * * *recCrop.Height, GraphicsUnit.Pixel) * * * * * *Catch er As Exception * * * * * * * *TakeNote("CROP ERR: " & er.ToString) * * * * * * * *Throw er * * * * * *Finally * * * * * * * *bmpCrop.Save(_pathOutputImage) * * * * * * * *_inputImage = Drawing.Image.FromFile(_pathOutputImage) * * * * * *End Try * * * *End Function * * * *Public Function Rotate(ByVal Flip As String) * * * * * *_pathOutputImage = getRandomName() * * * * * *TakeNote("Rotating : " & Flip) * * * * * *Dim thumb As System.Drawing.Image * * * * * *Try * * * * * * * *thumb = _inputImage * * * * * * * *Select Case Flip * * * * * * * * * *Case "90" * * * * * * * * * * * *thumb.RotateFlip(RotateFlipType.Rotate90FlipXY) * * * * * * * * * *Case "180" * * * * * * * * * * * *thumb.RotateFlip(RotateFlipType.Rotate180FlipXY) * * * * * * * * * *Case "270" * * * * * * * * * * * *thumb.RotateFlip(RotateFlipType.Rotate270FlipXY) * * * * * * * *End Select * * * * * *Catch er As Exception * * * * * * * *TakeNote("ROTATE ERR: " & er.ToString) * * * * * * * *Throw * * * * * *Finally * * * * * * * *thumb.Save(_pathOutputImage) * * * * * * * *_inputImage = thumb * * * * * * * *thumb.Dispose() * * * * * *End Try * * * *End Function * * * *Public Function Resize(ByVal Width As String, ByVal Height As String) * * * * * *_pathOutputImage = getRandomName() * * * * * *Dim thumb As System.Drawing.Image * * * * * *thumb = _inputImage * * * * * *Dim inp As New IntPtr() * * * * * *Dim strMax As String = Width * * * * * *If CInt(thumb.Width) > CInt(thumb.Height) Then * * * * * * * *Width = strMax * * * * * * * *Height = thumb.Height / (thumb.Width / Width) * * * * * *Else * * * * * * * *Height = CInt(strMax) * * * * * * * *Width = thumb.Width / (thumb.Height / CInt(Height)) * * * * * *End If * * * * * *Try * * * * * * * *TakeNote("Resize " & Height & " x " & Width) * * * * * * * *If Height > 0 And Width > 0 Then * * * * * * * * * *thumb.RotateFlip(RotateFlipType.Rotate90FlipXY) * * * * * * * * * *thumb.RotateFlip(RotateFlipType.Rotate270FlipXY) * * * * * * * * * *If CInt(thumb.Width) > CInt(Width) Then * * * * * * * * * * * *thumb = thumb.GetThumbnailImage(Width, Height, Nothing, inp) * * * * * * * * * *End If * * * * * * * *Else * * * * * * * * * *thumb = _inputImage * * * * * * * *End If * * * * * *Catch er As Exception * * * * * * * *TakeNote("RESIZE ERR: " & er.ToString) * * * * * * * *Throw er * * * * * *Finally * * * * * * * *myImageCodecInfo = GetEncoderInfo(ImageFormat.Jpeg) * * * * * * * *myEncoder = Imaging.Encoder.Quality * * * * * * * *myEncoderParameters = New EncoderParameters(1) * * * * * * * *myEncoderParameter = New EncoderParameter(myEncoder, CType(75L, Int32)) * * * * * * * *myEncoderParameters.Param(0) = myEncoderParameter * * * * * * * *thumb.Save(_pathOutputImage, myImageCodecInfo, myEncoderParameters) * * * * * * * *_inputImage = thumb * * * * * * * *thumb.Dispose() * * * * * * * *thumb = Nothing * * * * * * * *myImageCodecInfo = Nothing * * * * * * * *myEncoder = Nothing * * * * * * * *myEncoderParameters = Nothing * * * * * * * *myEncoderParameter = Nothing * * * * * *End Try * * * *End Function * * * *Public Function SaveImage() As String * * * * * *Log = Nothing * * * * * *Return _strFileName * * * *End Function * * * *Private Sub TakeNote(ByVal str As String) * * * * * *Log.Append(str & vbCrLf) * * * *End Sub * * * *Private Function RndString(Optional ByVal sLen As Integer = 15) As String * * * * * *Dim r As String = "" * * * * * *Dim i As Integer * * * * * *Randomize() * * * * * *For i = 1 To sLen * * * * * * * *Randomize(Int((57 - 48 + 1) * Rnd() + 48)) * * * * * * * *Randomize() * * * * * * * *If Int(2 * Rnd() + 1) = 1 Then * * * * * * * * * *r = r + Chr(Int((57 - 48 + 1) * Rnd() + 48)) * * * * * * * *Else * * * * * * * * * *r = r + Chr(Int((90 - 65 + 1) * Rnd() + 65)) * * * * * * * *End If * * * * * *Next i * * * * * *Return DateTime.Now.Year & DateTime.Now.Month & DateTime.Now.Day & r * * * *End Function * * * *Private Shared Function GetEncoderInfo(ByVal format As Imaging.ImageFormat) As Imaging.ImageCodecInfo * * * * * *Dim j As Integer * * * * * *Dim encoders() As Imaging.ImageCodecInfo * * * * * *encoders = Imaging.ImageCodecInfo.GetImageEncoders() * * * * * *j = 0 * * * * * *While j < encoders.Length * * * * * * * *If encoders(j).FormatID = format.Guid Then * * * * * * * * * *Return encoders(j) * * * * * * * *End If * * * * * * * *j += 1 * * * * * *End While * * * * * *Return Nothing * * * *End Function 'GetEncoderInfo * *End Class End Namespace Kod:
Dim ImageResize As New Image.Edit.Edit(strPath & "\" & strFilnamn) ImageResize.FileName(strFilnamn) ImageResize.Resize("640", "") ImageResize.SaveImage() ImageResize = Nothing |
|||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Medlem
|
Tack, ska se hur det blir när jag skrivit om den till C#, ska jag lägga den första koden i en aspx.cs fil, och den andra i aspx?
|
||
![]() |
![]() |
![]() |
#9 | |||
|
||||
Klarade millennium-buggen
|
Du kan lägga den första koden i en egen fil om du känner för det (skapa en ny fil av typen Class och klistra in koden). Sen kan du anropa den från var du vill i ditt projekt.
|
|||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Medlem
|
tack, har lite problem att skriva om koden till C# (är ganska ny på området), skall det inte finnas ett program som omvandlar vb till c#?
|
||
![]() |
![]() |
Svara |
|
|