2009-08-20 8 views
1

J'ai reçu ce bloc de code de link text et je l'ai légèrement modifié car je veux l'utiliser avec mon Uploader AJAX qui nécessite l'utilisation d'un Stream. pour ajouter des éléments téléchargés dans l'affichage des pièces jointes;Redimensionnement de l'image dans ASP.NET - Sortie en tant que flux de l'image redimensionnée pour

public Stream ResizeFromStream(int MaxSideSize, Stream Buffer) 
{ 
    int intNewWidth; 
    int intNewHeight; 
    System.Drawing.Image imgInput = System.Drawing.Image.FromStream(Buffer); 

    // GET IMAGE FORMAT 
    ImageFormat fmtImageFormat = imgInput.RawFormat; 

    // GET ORIGINAL WIDTH AND HEIGHT 
    int intOldWidth = imgInput.Width; 
    int intOldHeight = imgInput.Height; 

    // IS LANDSCAPE OR PORTRAIT ?? 
    int intMaxSide; 

    if (intOldWidth >= intOldHeight) 
    { 
     intMaxSide = intOldWidth; 
    } 
    else 
    { 
     intMaxSide = intOldHeight; 
    } 


    if (intMaxSide > MaxSideSize) 
    { 
     // SET NEW WIDTH AND HEIGHT 
     double dblCoef = MaxSideSize/(double)intMaxSide; 
     intNewWidth = Convert.ToInt32(dblCoef * intOldWidth); 
     intNewHeight = Convert.ToInt32(dblCoef * intOldHeight); 
    } 
    else 
    { 
     intNewWidth = intOldWidth; 
     intNewHeight = intOldHeight; 
    } 

    // CREATE NEW BITMAP 
    Bitmap bmpResized = new Bitmap(imgInput, intNewWidth, intNewHeight); 

    // SAVE BITMAP TO STREAM 
    MemoryStream imgStream = new MemoryStream(); 
    bmpResized.Save(imgStream, imgInput.RawFormat); 

    // RELEASE RESOURCES 
    imgInput.Dispose(); 
    bmpResized.Dispose(); 
    Buffer.Close(); 

    return imgStream; 
} 

et étant appelé dans ce bloc de code;

private void ItemPicture_FileUploaded(object sender, UploaderEventArgs args) 
{ 
    if (GetVisibleItemCount() >= 5) 
     return; 

    using (System.IO.Stream stream = args.OpenStream()) 
    { 
     ImageResize ir = new ImageResize(); 
     // This returns a 0 byte stream 
     ItemPictureAttachments.Upload(args.FileSize, args.FileName, ir.ResizeFromStream(640, stream)); 
     // This works fine 
     // ItemPictureAttachments.Items.Add(args.FileSize, args.FileName, stream); 
    } 
} 

Est-ce que je fais mal de retourner le flux à l'endroit où il est appelé? Merci!

+0

Avez-vous envisagé d'utiliser [une bibliothèque open-source] (http://imageresizing.net) pour obtenir une meilleure qualité d'image et [éviter tous les cas de bords] (http://nathanaeljones.com/163/20-image -resizing-pièges /)? Vous pouvez remplacer tout ce code par 'ImageBuilder.Current.Build (httpPostedFile," file.jpg ", new Resizeettings (" largeur = valeur & hauteur = valeur ")); –

Répondre

0

Basé sur votre code tout semble OK. Je vous suggère de mettre un point d'arrêt à

Bitmap bmpResized = new Bitmap(imgInput, intNewWidth, intNewHeight); 

et d'inspecter si imgInput n'est pas vide. Ou peut-être que quelque chose ne va pas avec ImageRawFormat.

0

J'ai testé votre méthode ResizeFromStream à l'aide de la propriété RecentlyFile.Inputstream d'un contrôle de fichier ASP.NET classique, et cela a fonctionné correctement. Peut-être que le problème est avec le composant que vous utilisez pour récupérer le flux du fichier (args.OpenStream())?

+0

Oui, je vais juste utiliser le téléchargement régulier. Merci les gars! :) –

Questions connexes