2013-11-14 2 views
1

Идти здесь бонкеров, пытаясь сделать это в WPF (со всеми новыми инструментами для обработки изображений), но не может найти рабочего решения. До сих пор все решения привлекали их на экран или делали несколько сейвов, но мне нужно сделать это полностью в памяти.прочитайте jpg, измените размер, сохраните как png в приложении WPF C# или vb.net

В принципе, я хочу загрузить большой JPEG в память, изменить его размер (в памяти), сохранить в виде небольшого PNG-файла. Я могу загрузить файл jpeg в объект BitMap, отлично. после этого я в тупике.

Я нашел эту функцию, которая выглядит так, как будто это трюк, но для этого требуется ImageSource (к сожалению, я не могу найти способ преобразования моего объекта BitMap в памяти в ImageSource, который не дает исключения NULL.)

private static BitmapFrame CreateResizedImage(ImageSource source, int width, int height, int margin) 
{ 
    dynamic rect = new Rect(margin, margin, width - margin * 2, height - margin * 2); 

    dynamic @group = new DrawingGroup(); 
    RenderOptions.SetBitmapScalingMode(@group, BitmapScalingMode.HighQuality); 
    @group.Children.Add(new ImageDrawing(source, rect)); 

    dynamic drawingVisual = new DrawingVisual(); 
    using (drawingContext == drawingVisual.RenderOpen()) 
    { 
     drawingContext.DrawDrawing(@group); 
    } 

    // Resized dimensions 
    // Default DPI values 
    dynamic resizedImage = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default); 
    // Default pixel format 
    resizedImage.Render(drawingVisual); 

    return BitmapFrame.Create(resizedImage); 
} 

ответ

4

с WPF это так просто, как это:

private void ResizeImage(string inputPath, string outputPath, int width, int height) 
{ 
    var bitmap = new BitmapImage(); 

    using (var stream = new FileStream(inputPath, FileMode.Open)) 
    { 
     bitmap.BeginInit(); 
     bitmap.DecodePixelWidth = width; 
     bitmap.DecodePixelHeight = height; 
     bitmap.CacheOption = BitmapCacheOption.OnLoad; 
     bitmap.StreamSource = stream; 
     bitmap.EndInit(); 
    } 

    var encoder = new PngBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(bitmap)); 

    using (var stream = new FileStream(outputPath, FileMode.Create)) 
    { 
     encoder.Save(stream); 
    } 
} 

Вы можете рассмотреть только установить один из DecodePixelWidth и DecodePixelHeight для того, чтобы сохранить пропорции исходного изображения.

Смежные вопросы