using(Image image = Image.FromStream(InputStreamen))
{
using(Image newimage = image.GetThumbnailImage(200, 200, null, IntPtr.Zero))
{
// gör något med newimage
}
}
Fungerar, dock blir inte kvaliten den bästa.
15 svar · 1 459 visningar · startad av degen18
Det är så att jag ska bygga en sida där man kan ladda upp en bild, och den ska skalas om så att jag kan göra en thumbnail.
Så jag behöver en stor bild och en beskuren bild av den bilden jag laddar upp.
Min fråga är om det går lösa och hur isf ??
Jag är nybörjare så det kanske är en väldigt dum fråga men jag hoppas på hjälp och tipps iaf.
Tack på förhand.
using(Image image = Image.FromStream(InputStreamen))
{
using(Image newimage = image.GetThumbnailImage(200, 200, null, IntPtr.Zero))
{
// gör något med newimage
}
}
Fungerar, dock blir inte kvaliten den bästa.
Använder själv denna:
Bitmap Resize(System.Drawing.Image image, int width, int height)
{
Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);
bitmap.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using(Graphics graphics = Graphics.FromImage(bitmap))
{
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.DrawImage(image,
new Rectangle(0, 0, width, height),
new Rectangle(0, 0 ,image.Width, image.Height),
GraphicsUnit.Pixel);
}
return bitmap;
}
Funkar fint, förutom att det blir en border(1px) på vänster och topkanten.
Här har du lite kod i vb.net som du kan leka med:
Public Shared Function AddManyFiles(ByVal strDir As String)
Dim dirFiles As New DirectoryInfo(strDir)
Dim fiArr As FileInfo() = dirFiles.GetFiles()
Dim fi As FileInfo
For Each fi In fiArr
Dim TIA As System.Drawing.Image.GetThumbnailImageAbort
Dim imgFormat As Imaging.ImageFormat
Dim mImage As System.Drawing.Image
Select Case IO.Path.GetExtension(fi.FullName)
Case ".jpg", ".JPG", ".jpeg", ".JPEG"
imgFormat = Imaging.ImageFormat.Jpeg
Case ".gif", ".GIF"
imgFormat = Imaging.ImageFormat.Gif
Case ".bmp", ".BMP"
imgFormat = Imaging.ImageFormat.Bmp
Case ".png", ".PNG"
imgFormat = Imaging.ImageFormat.Png
End Select
'Try
mImage = mImage.FromFile(fi.FullName)
Dim btm As New Bitmap(mImage)
mImage.Dispose()
mImage = btm
mImage = mImage.GetThumbnailImage(200, 200, TIA, IntPtr.Zero)
mImage.Save(fi.DirectoryName & "\TumbNails\" & fi.Name, imgFormat)
Next
End Function
André Colbjörnsen skrev en bra artikel om högkvalitativa tumnaglar på dotNETfriends.se. http://www.dotnetfriends.se/DesktopDefault.aspx?tabid=45
Funkar fint, förutom att det blir en border(1px) på vänster och topkanten.
Det löser man med en fuling. Man sätter top och left till -1 istället för 0, och så ökar man på width och height med 1 så löser det sig.
- magnus
Hur du ska använda den?
Du ska kalla på funktionen och skicka in en Image , bredd och höjd.
Gladh skrev:
Funkar fint, förutom att det blir en border(1px) på vänster och topkanten.
Det löser man med en fuling. Man sätter top och left till -1 istället för 0, och så ökar man på width och height med 1 så löser det sig.
- magnus
Löste det faktiskt genom att tabort PixelFormat.Format24bppRgb argumentet.
Löste det faktiskt genom att tabort PixelFormat.Format24bppRgb argumentet.
Visst, vill man använda B-lösningar så kan man ju göra det :P
- M
:bire
P skrev:
Här har du lite kod i vb.net som du kan leka med:
Public Shared Function AddManyFiles(ByVal strDir As String) Dim dirFiles As New DirectoryInfo(strDir) Dim fiArr As FileInfo() = dirFiles.GetFiles() Dim fi As FileInfo For Each fi In fiArr Dim TIA As System.Drawing.Image.GetThumbnailImageAbort Dim imgFormat As Imaging.ImageFormat Dim mImage As System.Drawing.Image Select Case IO.Path.GetExtension(fi.FullName) Case ".jpg", ".JPG", ".jpeg", ".JPEG" imgFormat = Imaging.ImageFormat.Jpeg Case ".gif", ".GIF" imgFormat = Imaging.ImageFormat.Gif Case ".bmp", ".BMP" imgFormat = Imaging.ImageFormat.Bmp Case ".png", ".PNG" imgFormat = Imaging.ImageFormat.Png End Select 'Try mImage = mImage.FromFile(fi.FullName) Dim btm As New Bitmap(mImage) mImage.Dispose() mImage = btm mImage = mImage.GetThumbnailImage(200, 200, TIA, IntPtr.Zero) mImage.Save(fi.DirectoryName & "\TumbNails\" & fi.Name, imgFormat) Next End Function
kan man kombinera detta med det andra scriptet för att ändra kvaliteten på jpg-bilderna..
jag har bilder som är ca 100KB, tummnaglarna blir då på ca 16KB..
med:
mImage.Save(fi.DirectoryName & "\TumbNails\" & fi.Name, ImageFormat.Gif)
så blir bilderna gif oavsett vilket format de var i från början.
hamnar då på ca 2KB..
Men det känns inte som en helt ren lösning, dessutom blir ju bilderna såklart ruskigt gryniga
Denna använder jag och den ger fina thumbnails
kolla på Mitt Galleri (De skalas i realtid på galleriet vilket klassen nedan inte gör )
using System;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
namespace dps
{
/// <summary>
/// Detta är klassen som manipulerar bilder när de laddas upp
/// </summary>
public class imgman
{
//Sätt Globala variablar
private int iHeight, iWidth;
private string szFileName;
//Structen som körs när en ny instans skapas
public imgman()
{
//Sätt filnamnet till temp.jpeg som bilden heter precis när den laddats upp.
szFileName = System.Web.HttpContext.Current.Request.MapPath("../ProdImages/temp.jpeg");
iWidth = 200;
iHeight = 200;
}
//När vi skapar en ny arkikel så kallas denna
public string GenerateWithRandomName(string ArtNr)
{
//Kolla på kommentaren till thumbs.aspx
System.Drawing.Image image = System.Drawing.Image.FromFile(szFileName);
Bitmap bmp = new Bitmap(iWidth, iHeight);
Graphics gr = Graphics.FromImage(bmp);
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
gr.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
gr.DrawImage(image, 0, 0, iWidth, iHeight);
gr.Save();
EncoderParameters eps = new EncoderParameters(1);
eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 60);
//Skapa en random generator
Random rand = new Random();
//Får Bildnamnet ARTNR01.jpeg tex
//Den får Artnr plus två random siffror plus filändelser
string Name = ArtNr + rand.Next(10,99).ToString() + ".jpeg";
//Spara bilden till disk
bmp.Save(System.Web.HttpContext.Current.Request.MapPath("../ProdImages/" + Name));
image.Dispose();
bmp.Dispose();
//Ta bort temp bilden
File.Delete(System.Web.HttpContext.Current.Request.MapPath("../ProdImages/temp.jpeg"));
//Och returnera namnet så att det kan sparas i databas.
return Name;
}
}
}
jag förstod inte riktigt din kod.. :(
tyckte det var en del saker som deklarerades men som sen aldrig användes ?!
men jag hittade den info jag behövde i
http://www.webforum.nu/showthread.php?s=&forumid=191&threadid=70412&highlight=Encoder
Resultatet:
Dim eps As EncoderParameters = New EncoderParameters(1)
eps.Param(0) = New EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 50)
Dim ici As ImageCodecInfo = GetEncoderInfo("image/jpeg")
dim newFullPath as string = imageFullPathLocation & "tummnaglar/tumme_" & imgUrl
fullSizeImg.Save(newFullPath, ici, eps)
Private Function GetEncoderInfo(ByVal mimeType As String) As ImageCodecInfo
Dim j As Integer
Dim encoders As ImageCodecInfo()
encoders = ImageCodecInfo.GetImageEncoders()
For j = 0 To encoders.Length
If encoders(j).MimeType = mimeType Then
Return encoders(j)
End If
Next j
Return Nothing
End Function