2009-08-20 2 views
1

Я получил этот блок кода от link text и немного изменил его, потому что я хочу использовать его с моим загрузчиком AJAX, который нуждается в потоке, который будет использоваться для добавления загруженных элементов на экран вложений;Изменение размера изображения в ASP.NET - вывод как поток с уменьшенным размером изображения для

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; 
} 

и вызывается в этом блоке кода;

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); 
    } 
} 

Я делаю это неправильно, возвращая поток обратно туда, откуда его зовут? Благодаря!

+0

Вы рассмотрели возможность использования [библиотеки с открытым исходным кодом] (http://imageresizing.net), чтобы улучшить качество изображения и [избегать всех случаев краев] (http://nathanaeljones.com/163/20-image -resizing-ловушек /)? Вы можете заменить весь этот код на «ImageBuilder.Current.Build (httpPostedFile,« file.jpg », новый Resizeettings (« width = value & height = value »));'. –

ответ

0

На основе вашего кода все выглядит нормально. Я предлагаю вам поставить точку останова на

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

и проверить, не является ли imgInput пустым. Или, возможно, что-то не так с ImageRawFormat.

0

Я протестировал ваш метод ResizeFromStream, используя свойство AddFile.Inputstream обычного элемента управления ASP.NET File, и это сработало нормально. Возможно, проблема связана с компонентом, который вы используете для получения потока файла (args.OpenStream())?

+0

Да, я просто использую обычную загрузку. Спасибо, парни! :) – 2009-08-20 21:28:52