webForumDet fria alternativet

Skala bilder proportionerligt?

.NETur .NET

1 svar · 477 visningar · startad av robba82

Medlem sedan jan. 20064 inlägg
Frågan#1

Med skriptet nedan kan jag anpassa bredd och höjd på en bild automatiskt:
bild.aspx?img=varberg.jpg&w=250&h=200

Men jag skulle vilja att det räckte att man skrev:
bild.aspx?img=varberg.jpg&w=250
Att den med andra ord automatiskt läser in höjden på originalbilden och anpassar den proportionerligt mot den bredd man vill ha.

Går det?

<%@Import Namespace="System.Drawing.Imaging" %>
<script language="VB" runat="server">
  Function ThumbnailCallback() as Boolean
    Return False
  End Function

  Sub Page_Load(sender as Object, e as EventArgs)
  
    'Read in the image filename to create a thumbnail of
    Dim imageUrl as String = Request.QueryString("img")
    
    'Read in the width and height
    Dim imageHeight as Integer = Request.QueryString("h")
    Dim imageWidth as Integer = Request.QueryString("w")

    'Make sure that the image URL doesn't contain any /'s or \'s
    If imageUrl.IndexOf("/") >= 0 Or imageUrl.IndexOf("\") >= 0 then
      'We found a / or \
      Response.End()
    End If
    
    'Add on the appropriate directory
    imageUrl = "artikelbilder/" & imageUrl
    
    Dim fullSizeImg as System.Drawing.Image
    fullSizeImg = System.Drawing.Image.FromFile(Server.MapPath(imageUrl))

    'Do we need to create a thumbnail?
    Response.ContentType = "image/jpeg"
    If imageHeight > 0 and imageWidth > 0 then
      Dim dummyCallBack as System.Drawing.Image.GetThumbNailImageAbort
      dummyCallBack = New System.Drawing.Image.GetThumbnailImageAbort(AddressOf ThumbnailCallback)

      Dim thumbNailImg as System.Drawing.Image
      thumbNailImg = fullSizeImg.GetThumbnailImage(imageWidth, imageHeight, dummyCallBack, IntPtr.Zero)

      thumbNailImg.Save(Response.OutputStream, ImageFormat.Jpeg)  

      'Clean up / Dispose...
      ThumbnailImg.Dispose()
    Else
      fullSizeImg.Save(Response.OutputStream, ImageFormat.Jpeg)  
    End If
    
    'Clean up / Dispose...
    fullSizeImg.Dispose()
  End Sub
</script>
Medlem sedan nov. 20011 551 inlägg
#2

Har bara gjort i c# men...

Jag hackar in lite kod här, det är inte komplett då min imagemanager är ganska gross nuförtiden men detta borde få dig på rätt spår. jag har tagit bort lite som rör min vattenmärkning etc. Observera att du får skicka in bilden som en stream och att du får tillbaka den som bytearray, så du får kanske köra en handler eller nåt som presenterar den... jag använder den i detta fallet för att spara ned bilden i en db och sedan har jag en handler som presenterar den :)

	public const int DEFAULT_MAX_LENGTH = 1000;
	public const int DEFAULT_QUALITY = 80;

public byte[] ResizeAndWaterMarkPicture(Stream stream)
	{
		int maxLength;
		if (!Int32.TryParse(ConfigurationManager.AppSettings["PictureLongestSide"], out maxLength))
		{
			maxLength = DEFAULT_MAX_LENGTH;
		}

		int picQuality;
		if (!Int32.TryParse(ConfigurationManager.AppSettings["PictureQuality"], out picQuality))
		{
			picQuality = DEFAULT_QUALITY;
		}
		Bitmap bitmap = null;
		bitmap = Resize(Image.FromStream(stream), maxLength);
				
		return bitmap;
		
	}

private static Bitmap Resize(Image image, int maxLength)
	{
		Size size = CalculateNewSizeByLongestSide(maxLength, image.Height, image.Width);

		Bitmap bitmap = new Bitmap(size.Width, size.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, size.Width, size.Height),
							   new Rectangle(0, 0, image.Width, image.Height),
							   GraphicsUnit.Pixel);
		}
		return bitmap;
	}

public static Size CalculateNewSizeByLongestSide(int maxLength, int orgHeight, int orgWidth)
	{
		Size newSize = new Size();
		double ratio;
		if (orgHeight > orgWidth)
		{
			newSize.Height = maxLength;
			ratio = (double)orgHeight / maxLength;
			newSize.Width = (int)Math.Floor(orgWidth / ratio);
		}
		else
		{
			newSize.Width = maxLength;
			ratio = (double)orgWidth / maxLength;
			newSize.Height = (int)Math.Floor(orgHeight / ratio);
		}
		return newSize;
	}
135 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)