2011-01-11 7 views
4

ich den folgenden Code in meiner Website verwende, für Thumbnail-Erstellung:erstellen Thumbnail in C# .NET von Breite zu definieren

string furl = "~/images/thumbs/" + matchString; 
lBlogThumb.ImageUrl = GetThumbnailView(furl, 200, 200); 


private string GetThumbnailView(string originalImagePath, int height, int width) 
     { 
      //Consider Image is stored at path like "ProductImage\\Product1.jpg" 

      //Now we have created one another folder ProductThumbnail to store thumbnail image of product. 
      //So let name of image be same, just change the FolderName while storing image. 
      string thumbnailImagePath = originalImagePath.Replace("thumbs", "thumbs2"); 
      //If thumbnail Image is not available, generate it. 
      if (!System.IO.File.Exists(Server.MapPath(thumbnailImagePath))) 
      { 
       System.Drawing.Image imThumbnailImage; 
       System.Drawing.Image OriginalImage = System.Drawing.Image.FromFile(Server.MapPath(originalImagePath)); 
       imThumbnailImage = OriginalImage.GetThumbnailImage(width, height, 
          new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero); 

       imThumbnailImage.Save(Server.MapPath(thumbnailImagePath), System.Drawing.Imaging.ImageFormat.Jpeg); 

       imThumbnailImage.Dispose(); 
       OriginalImage.Dispose(); 
      } 
      return thumbnailImagePath; 
     } 

public bool ThumbnailCallback() { return false; } 

Ich mag diesen Code ändern, und in der Lage sein, eine Miniaturansicht definieren Breite zu erstellen NUR. Was ich im Sinn habe, ist eigentlich etwas wie das Zuschneiden/Ändern der Bildgröße, das Verwenden einer statischen Breite, das Beibehalten des Verhältnisses. Ist das möglich;

+1

Ist das, was Sie wollen? newHeight = oldHeight * newWidth/oldWidth, nicht sicher, was du meinst, wenn du sagst, dass du das Bild zuschneiden willst - willst du es zuschneiden UND die Größe ändern? –

+0

danke für deine hilfe – zekia

+0

idk warum aber das gab mir eine "aus dem speicher" err .. gibt es jemanden, der eine ausnahme dafür setzen kann? Ich weiß nicht wirklich, wie C# Speicher verarbeitet. –

Antwort

7

haben wir originalWidth = die ursprüngliche Bildbreite und thumbWidth. Sie können einfach die thumbWidth auf den gewünschten Wert und berechnen die thumbHeigth=originalHeigth*thumbWidth/originalWidth

+0

danke für Ihre Hilfe – zekia

0

Ein einfaches Beispiel ohne Rundung mit einer Miniaturansicht Breite von 140, unterhalb der 'Datei' ist ein HttpPostedFile hochgeladen von einem ASP.Net FileUpload-Steuerelement, die HttpPostedFile macht einen Stream verfügbar.

// Save images to disk. 
using (System.Drawing.Image image = System.Drawing.Image.FromStream(file.InputStream)) 
using (System.Drawing.Image thumbnailImage = image.GetThumbnailImage(140, Convert.ToInt32((image.Height/(image.Width/140))), null, IntPtr.Zero)) 
{ 
    if (image != null) 
    { 
     image.Save(imageFilePath); 
     thumbnailImage.Save(thumbnailImagePath); 
    } 
    else 
     throw new ArgumentNullException("Image stream is null"); 
} 
15

Sie erwähnen die Größenanpassung und Zuschneiden. Wenn Sie möchten, dass die Höhe der Miniaturansichten mit einer festen Breite variiert, funktionieren die bereits bereitgestellten Antworten für Sie.

Die Erwähnung des Zuschneidens lässt mich denken, dass Sie vielleicht eine feste Miniaturgröße wünschen, mit der Breite gefüllt und jeder überlaufende vertikale Teil abgeschnitten. Wenn das der Fall ist, müssen Sie etwas mehr Arbeit erledigen. Ich brauchte in letzter Zeit etwas Ähnliches, und genau das habe ich mir ausgedacht.

Dadurch wird ein Miniaturbild des Originals erstellt, das so zugeschnitten und zugeschnitten wird, dass das Quellbild das Zielminiaturbild vollständig ausfüllt und Überlauf abgeschnitten wird. Innerhalb der Miniaturansicht werden keine Ränder angezeigt, auch wenn das Seitenverhältnis von Original und Miniaturbild unterschiedlich ist.

public System.Drawing.Image CreateThumbnail(System.Drawing.Image image, Size thumbnailSize) 
{ 
    float scalingRatio = CalculateScalingRatio(image.Size, thumbnailSize); 

    int scaledWidth = (int)Math.Round((float)image.Size.Width * scalingRatio); 
    int scaledHeight = (int)Math.Round((float)image.Size.Height * scalingRatio); 
    int scaledLeft = (thumbnailSize.Width - scaledWidth)/2; 
    int scaledTop = (thumbnailSize.Height - scaledHeight)/2; 

    // For portrait mode, adjust the vertical top of the crop area so that we get more of the top area 
    if (scaledWidth < scaledHeight && scaledHeight > thumbnailSize.Height) 
    { 
     scaledTop = (thumbnailSize.Height - scaledHeight)/4; 
    } 

    Rectangle cropArea = new Rectangle(scaledLeft, scaledTop, scaledWidth, scaledHeight); 

    System.Drawing.Image thumbnail = new Bitmap(thumbnailSize.Width, thumbnailSize.Height); 
    using (Graphics thumbnailGraphics = Graphics.FromImage(thumbnail)) 
    { 
     thumbnailGraphics.CompositingQuality = CompositingQuality.HighQuality; 
     thumbnailGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     thumbnailGraphics.SmoothingMode = SmoothingMode.HighQuality; 
     thumbnailGraphics.DrawImage(image, cropArea); 
    } 
    return thumbnail; 
} 

private float CalculateScalingRatio(Size originalSize, Size targetSize) 
{ 
    float originalAspectRatio = (float)originalSize.Width/(float)originalSize.Height; 
    float targetAspectRatio = (float)targetSize.Width/(float)targetSize.Height; 

    float scalingRatio = 0; 

    if (targetAspectRatio >= originalAspectRatio) 
    { 
     scalingRatio = (float)targetSize.Width/(float)originalSize.Width; 
    } 
    else 
    { 
     scalingRatio = (float)targetSize.Height/(float)originalSize.Height; 
    } 

    return scalingRatio; 
} 

mit Ihrem Code zu verwenden, können Sie Ihren Anruf OriginalImage.GetThumbnailImage mit diesem ersetzen:

imThumbnailImage = CreateThumbnail(OriginalImage, new Size(width, height)); 

Beachten Sie, dass dieser Code für Portraitaufnahmen, tatsächlich die Miniaturansicht des Ansichtsfenster etwas höher auf dem Originalbild verschieben . Dies geschah, damit Porträtaufnahmen von Menschen nicht zu kopflosen Torsi führen, wenn die Thumbnails erstellt wurden. Wenn Sie diese Logik nicht möchten, entfernen Sie einfach den if Block nach dem Kommentar "Hochformat".

Verwandte Themen