2013-04-15 19 views
5

Burada işim biter.HTTP İşleyiciyi kullanarak görüntüleri yeniden boyutlandırma ASP.Net, bazı resimler gösterilmiyor

Görüntüyü (yeniden boyutlandırılan) aşağı gönderen bir HTTP İşleyici (ImageHandler.ashx), standart bir HTTP işleyicisi (Yeniden Kullanılabilir'i true ve false ile denedim) kullanarak küçük resmi yeniden boyutlandırmak ve döndürmek için Image.GetThumbnailImage öğesini kullanıyorum.

Bir html görüntü denetimi olan bir tabloya sahip bir asp Datalist denetimi kullanıyorum.

 <asp:DataList ID="listImg" runat="server" RepeatColumns="4" RepeatDirection="Horizontal" 
     ShowFooter="false" ShowHeader="false"> 
     <ItemTemplate> 
      <table width="220px"> 
       <tr width="100%"> 
        <td> 
         <img src="Scripts/ImageHandler.ashx?width=125&image=Upload/<%# DataBinder.Eval(Container.DataItem, "photo") %>"        
        </td> 
       </tr> 
      </table> 
     </ItemTemplate> 
    </asp:DataList> 

İşleyici gereksinimlerini gördüğünüz gibi, genişlik ve Görüntü yolu.

Bu Datalist, görüntülenecek resimlerin listesini sağlayan bir veri dosyasına (ImageData) bağlıdır.

Şimdiye kadar mantıklı olan, şimdi sorun şu ki - 5 resim yüklediğimi söyle, yani benim ImageData DataTable'ım 5 satır var, sadece 3-4 resmin görüntüleneceği, kalan sadece görüntü yokken olduğu gibi kırmızı bir X ile gel. hepsi orada hiçbir eksik görüntüleri değilsin, görüntüyü göreceksiniz

http://localhost:3540/Scripts/ImageHandler.ashx?width=150&image=Upload/Test123.jpg 

- Şimdi kod bakmak ve benzeri görüntü src giderseniz. Yeniden yükle ve geri döndüler.

Firefox'ta bunu çalıştırdım ve Firebug'u açtım ve Görüntüler sekmesini incelediğimde, TÜM resimler Firebug'a göre döndürülüyordu (Durum 200 Tamam ve Yanıt sekmesindeki Görüntüyü görüyorum), yalnızca Web sunucusu gibi bazılarını göstermiyor. Her zaman eksik olan işlem/yükleme için en uzun süren görüntüleri, onun bazı rasgele olanları DEĞİLDİR.

Burada neler olabilir?

Teşekkür ederiz.

DÜZENLEME 1 - İşleyici Kodunun Eklenmesi (orijinal), bu kodu devraldık. Caching'i buradan koddan çıkardım, ancak oluşturulan bir kez FYI küçük resimleri önbelleğe alındı.

public class ImageHandler : IHttpHandler{ 
public int _width; 
public int _height; 
public int _percent; 
public string imageURL; 


public void ProcessRequest(HttpContext context) 
{ 
    try 
    { 
     Bitmap bitOutput; 

     string appPath = Convert.ToString(System.Configuration.ConfigurationManager.AppSettings["ImagePath"]); 

     String strArquivo = appPath + context.Request.QueryString["image"].Replace("/", "\\"); 

     if (!(String.IsNullOrEmpty(context.Request["width"]))) 
     { 
      Bitmap bitInput = GetImage(context); 

      if (SetHeightWidth(context, bitInput)) 
      { bitOutput = ResizeImage(bitInput, _width, _height, _percent); } 
      else { bitOutput = bitInput; } 

      context.Response.ContentType = "image/jpeg"; 
      bitOutput.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
     } 

     return; 

    } 
    catch (Exception ex) { /*HttpContext.Current.Response.Write(ex.Message);*/ } 
} 


/// <summary> 
/// Get the image requested via the query string. 
/// </summary> 
public Bitmap GetImage(HttpContext context) 
{ 
    try 
    { 
     if (context.Cache[("ImagePath-" + context.Request.QueryString["image"])] == null) 
     { 
      string appPath = Convert.ToString(System.Configuration.ConfigurationManager.AppSettings["ImagePath"]); 

      appPath = appPath + context.Request.QueryString["image"].Replace("/", "\\"); 
      Bitmap bitOutput; 
      imageURL = appPath; 


      bitOutput = new Bitmap(appPath); 
      return bitOutput; 
     } 
     else 
     { 
      return (Bitmap)context.Cache[("ImagePath-" + context.Request.QueryString["image"])]; 
     } 

    } 
    catch (Exception ex) { throw ex; } 
}  


/// <summary> 
/// Set the height and width of the handler class. 
/// </summary> 
public bool SetHeightWidth(HttpContext context, Bitmap bitInput) 
{ 
    try 
    { 
     double inputRatio = Convert.ToDouble(bitInput.Width)/Convert.ToDouble(bitInput.Height); 

     if (!(String.IsNullOrEmpty(context.Request["width"])) && !(String.IsNullOrEmpty(context.Request["height"]))) 
     { 
      _width = Int32.Parse(context.Request["width"]); 
      _height = Int32.Parse(context.Request["height"]); 
      return true; 
     } 
     else if (!(String.IsNullOrEmpty(context.Request["width"]))) 
     { 
      _width = Int32.Parse(context.Request["width"]); 
      _height = Convert.ToInt32((_width/inputRatio)); 
      if (_width == 400 &&_height > 500) 
      { 
       _height = 500; 
       _width = Convert.ToInt32(500 * inputRatio); 
      } 
      else if (_width == 125 && _height > 200) 
      { 
       _height = 200; 
       _width = Convert.ToInt32(200 * inputRatio); 
      } 
      return true; 
     } 
     else if (!(String.IsNullOrEmpty(context.Request["height"]))) 
     { 
      _height = Int32.Parse(context.Request["height"]); 
      _width = Convert.ToInt32((_height * inputRatio)); 
      return true; 
     } 
     else if (!(String.IsNullOrEmpty(context.Request["percent"]))) 
     { 
      _height = bitInput.Height; 
      _width = bitInput.Width; 
      _percent = Int32.Parse(context.Request["percent"]); 
      return true; 
     } 
     else 
     { 
      _height = bitInput.Height; 
      _width = bitInput.Width; 
      return false; 
     } 

    } 
    catch (Exception ex) { throw ex; } 
} 

/// <summary> 
/// Resizes bitmap using high quality algorithms. 
/// </summary> 
public static Bitmap ResizeImage(Bitmap originalBitmap, int newWidth, int newHeight, int newPercent) 
{ 
    try 
    { 
     if (newPercent != 0) 
     { 
      newWidth = Convert.ToInt32(originalBitmap.Width * (newPercent * .01)); 
      newHeight = Convert.ToInt32(originalBitmap.Height * (newPercent * .01)); 
     } 

     Bitmap inputBitmap = originalBitmap; 
     Bitmap resizedBitmap = new Bitmap(newWidth, newHeight, PixelFormat.Format64bppPArgb); 

     Graphics g = Graphics.FromImage(resizedBitmap); 
     g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
     g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy; 
     g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
     Rectangle rectangle = new Rectangle(0, 0, newWidth, newHeight); 
     g.DrawImage(inputBitmap, rectangle, 0, 0, inputBitmap.Width, inputBitmap.Height, GraphicsUnit.Pixel); 
     g.Dispose(); 

     return resizedBitmap; 

    } 
    catch (Exception ex) { throw ex; } 
} 


public bool IsReusable 
{ 
    get 
    { 
     return true; 
    } 
}} 

DÜZENLEME 2 birisi burada aspDataList (listImg) sınırdır DataTableOleDbSchemaGuid (imageData) oluşturmak için önceden tanımlanmış bir klasörden rastgele görüntüleri alır kodu dışarı Bütün bunları test etmek istiyorsa için -

 System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo(Server.MapPath("Upload")); 
     System.IO.FileInfo[] files = dirInfo.GetFiles(); 

     int fileCount = files.Length; 

     System.Data.DataTable ImageData = new System.Data.DataTable(); 
     System.Data.DataColumn dCol = new System.Data.DataColumn("photo"); 
     ImageData.Columns.Add(dCol); 


     System.Random rnd = new Random(); 
     int nxtNumber = 0; 

     System.Data.DataRow dRow = null; 

     string fileName = string.Empty; 

     for (int i = 0; i < 20; i++) 
     { 
      dRow = ImageData.NewRow(); 
      nxtNumber = rnd.Next(fileCount); 
      while (!files[nxtNumber].Extension.Equals(".jpg")) 
      { 
       nxtNumber = rnd.Next(fileCount); 
      } 
      fileName = files[nxtNumber].Name; 

      dRow["photo"] = fileName; 

      ImageData.Rows.Add(dRow); 
     } 
     listImg.DataSource = ImageData; 
     listImg.DataBind(); 
+0

İşleyici kodunu gönderir misiniz? Belki de bazen boş bir görüntü döndüren bir şey var. Ayrıca, görüntülerin Firebug’da 200 statüsü olduğunu söylediğinde, aynı zamanda içeriğe sahipler mi? Size döndürülen bayt sayısını söylemelisiniz. –

+0

Evet, içeriği (resim) ve boyutu gösterir. Ayrıca, her zaman aynı görüntü, boş görünmez, aynı önbelleğe alma olmadan birden fazla kez görüntüleniyor olsaydım, yok olan rasgele bir görüntü. Gereksiz şeyleri oradan kaldırdığımda İşleyici kodunu biraz göndereceğim. – Rakesh

+0

bu bir cevap değil, bir öneridir. Bu nuget paketine göz atmak isteyebilirsiniz: http://nuget.org/packages/ImageResizer gif yeniden boyutlandırma vb. için birkaç ekstra paket içerir. –

cevap

0

İşte buradaki komik şey - sunucudaki aynı kod daha öngörülebilir bir şekilde davranıyor, hala birkaç tane eksik fotoğrafım olabilir, ama şimdi 1'den 30-40 ortalamaya karşılık 1 yerel çevremdeki her 5'ten. Bu istekler asenkronize olduğundan, üzerinde çalıştığı makinenin gerçek işlemcisi ile ilgili bir şey olabilir, sunucu benim çoklu dizüstü bilgisayarma karşı birden çok istekle başa çıkmak için daha iyi uyarlandı mı?

Her iki yol da kodu değiştirdim, bu nedenle yeniden boyutlandırma söz konusu değil, işleyici kodu yeniden boyutlandırılmış görüntüleri getiriyor ve hepsi bu noktada iyi.

Girişleriniz için hepinize teşekkür ederiz.

0

deneyin ex, url'nin sorgu dizesi kodlamak için:

http://localhost:3540/Scripts/ImageHandler.ashx?width=150&image=Upload/Test123.jpg 

urlencode

için
http://localhost:3540/Scripts/ImageHandler.ashx?width%3D150%26image%3DUpload%2FTest123.jpg 
0

Gerçek kodunuzun img etiketinin sonunda /> olduğunu varsayalım ??? Değilse, önce bunu eklemeyi ve yeniden test etmeyi deneyebilirsiniz.

Gerçekten bir yanıt değil ancak img etiketini bir asp olarak değiştirmeyi deneyebilirsiniz: Verileri oluşturulup oluşturulmadığını görmek için görüntüyü görüntülemek yerine dosya adını metin olarak etiketlemek ve görüntülemek. Görüntü işleyicisine doğrudan erişirken görüntüleri doğrudan görebildiğiniz gibi, codebehind'deki datatable yapısıyla ilgili bir şey olduğunu söyleyebilirim.

Benzer bir şey yaptığımda, genellikle görüntüleri SQL DB'de saklar ve görüntüyü sorgu dizesindeki kayıt kimliğiyle döndürmek için görüntü işleyiciyi kullanır. Bu, bir klasörün içeriğine göre bir tane oluşturmak zorunda kalmak yerine varolan bir kayıt tablosunu döndürdüğünüz anlamına gelir.

İlgili konular