Как я могу создать миниатюру из изображения в папке сервера?

Я пытался понять это, но ничего не добился. Я пытаюсь сделать следующее: у меня есть страница aspx, на которой вы можете загружать изображения (они хранятся в папке на сервере), на одной странице вы можете видеть все загруженные изображения, и она генерирует ссылки (теги) со ссылкой на эти изображения, но до сих пор он загружал полные изображения в виде «эскизов», и они были слишком большими по размеру (1920x1200 пикселей). Поэтому я заменил изображение src на общий обработчик, который должен получать изображение из папку, а затем верните ее, изменив размер, например, 209x133px.

Но я понятия не имею, с чего начать, и я был бы признателен за любую задержку, может быть, кто-то когда-то делал что-то подобное.

В любом случае, заранее спасибо

Вот как я помечаю ссылки и изображения повторителем:

protected void repImages_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.AlternatingItem ||
        e.Item.ItemType == ListItemType.Item)
    {
        string sFile = e.Item.DataItem as string;

        //Create the thumblink
        HyperLink hlWhat = e.Item.FindControl("hlWhat") as HyperLink;
        hlWhat.NavigateUrl = ResolveUrl("~/_img/_upload/" + sFile);
        hlWhat.ToolTip = System.IO.Path.GetFileNameWithoutExtension(sFile);
        hlWhat.Attributes["rel"] = "imagebox-bw";
        hlWhat.Attributes["target"] = "_blank";

        Image oImg = e.Item.FindControl("imgTheImage") as Image;
        oImg.ImageUrl = ResolveUrl("Thumbnail.ashx?img=" + sFile);
        oImg.Width = 203;
        oImg.CssClass = "galleryImgs";

    }

}

а пока мой обработчик выглядит так:

<%@ WebHandler Language="C#" Class="Thumbnail" %>

using System;
using System.Web;

public class Thumbnail : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        if (!string.IsNullOrEmpty(context.Request.QueryString["img"]))
        {
            string fileName = context.Request.QueryString["img"];

        }

        else
        {

        }

    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}

person Some Developer    schedule 21.12.2012    source источник
comment
Проверьте это: dotnetspark.com/kb /   -  person CyclingFreak    schedule 21.12.2012
comment
Еще нет ответа на свой вопрос?   -  person Robert Fricke    schedule 24.01.2013
comment
ну, вообще-то да .. это первый комментарий Амитда, тот, что выше. Я забыл отметить один как ответ: S   -  person Some Developer    schedule 25.01.2013


Ответы (3)


Добавив пространства имен System.Drawing и System.Drawing.Drawing2D, вы можете изменить размер изображения CodeBehind:

public static System.Drawing.Image ScaleImage(System.Drawing.Image image, int maxHeight)
  {
      var ratio = (double)maxHeight / image.Height;
      var newWidth = (int)(image.Width * ratio);
      var newHeight = (int)(image.Height * ratio);
      var newImage = new Bitmap(newWidth, newHeight);
      using (var g = Graphics.FromImage(newImage))
      {
          g.DrawImage(image, 0, 0, newWidth, newHeight);
      }
      return newImage;
  }
person Satinder singh    schedule 21.12.2012

Вот код, который может потребовать некоторых настроек, но он поможет вам двигаться дальше.

// 1x1 transparent GIF
private readonly byte[] GifData = {
    0x47, 0x49, 0x46, 0x38, 0x39, 0x61,
    0x01, 0x00, 0x01, 0x00, 0x80, 0xff,
    0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
    0x00, 0x2c, 0x00, 0x00, 0x00, 0x00,
    0x01, 0x00, 0x01, 0x00, 0x00, 0x02,
    0x02, 0x44, 0x01, 0x00, 0x3b
};

public void ProcessRequest(HttpContext context)
{
    // render direct
    context.Response.BufferOutput = false;

    bool fFail = true;

    try
    {
      if (!string.IsNullOrEmpty(context.Request.QueryString["img"]))
      {
        string fileName = context.Request.QueryString["img"];         

        using( var inputImage = new Bitmap(fileName))
        {   
            // create the thubnail
            FinalImage = CreateThubNain();          

            // send it to browser
            FinalImage.Save(context.Response.OutputStream, ImageFormat.Jpeg);           
            // flag tha all ends up well
            fFail = false;
        }          
      }
    }
    catch(Exception x)
    {
        // log the error
        Debug.Fail("Check why is fail - error:" + x.ToString());
    }

    if(fFail)
    {
        // send something anyway
        context.Response.ContentType = "image/gif";
        context.Response.OutputStream.Write(GifData, 0, GifData.Length);
    }
    else
    {
        // this is a header that you can get when you read the image
        context.Response.ContentType = "image/jpeg";

        // the size of the image, saves from load the image, and send it here
        // context.Response.AddHeader("Content-Length", imageData.Length.ToString());

        // cache the image - 24h example
        context.Response.Cache.SetExpires(DateTime.Now.AddHours(24));
        context.Response.Cache.SetMaxAge(new TimeSpan(24, 0, 0));   
    }
}

и один вопрос о том, как сделать миниатюру: сделать миниатюру из базы данных изображение с сохранением соотношения сторон

Некоторые комментарии. Если вы используете обработчик для создания эскизов, вы тратите много времени, чтобы сделать то же самое и снова. Я предлагаю отслеживать эскизы и сохранять их на диск, а затем использовать прямой файл с диска.

person Aristos    schedule 21.12.2012

Мы используем такой метод:

private Image ScaleFreeHeight(string imagePath, int newWidth)
{
    var byteArray = new StreamReader(imagePath).BaseStream;        
    var image = Image.FromStream(byteArray);
    var newHeight2 = Convert.ToInt32(newWidth * (1.0000000 * image.Height / image.Width));
    var thumbnail = new Bitmap(newWidth, newHeight2);
    var graphic = Graphics.FromImage(thumbnail);
    graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
    graphic.SmoothingMode = SmoothingMode.HighQuality;
    graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
    graphic.CompositingQuality = CompositingQuality.HighQuality

    graphic.DrawImage(image, 0, 0, newWidth, newHeight2);

    return thumbnail;
}
person Robert Fricke    schedule 21.12.2012