【问题标题】:Resize image in WPF在 WPF 中调整图像大小
【发布时间】:2013-04-03 05:31:21
【问题描述】:

我有一张图片,我想重新调整它的大小并需要保存在我的临时文件夹中。

我尝试过的如下:

UIElement uie = CanvasHost.Child;
int width = 800;
int height = (int)((width / (double)((FrameworkElement)uie).Width) * (int)((FrameworkElement)uie).Height);          
RenderTargetBitmap rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
rtb.Render(uie);

string dir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\temp\";
if (!Directory.Exists(dir))
      Directory.CreateDirectory(dir);

long size = 0;

string filePath = dir + DateTime.Now.Ticks.ToString() + (isPng ? ".png" : ".jpg");
BitmapEncoder enc = null;

using (FileStream fs = File.Create(filePath))
{
    if (isPng)
        enc = new PngBitmapEncoder();
    else
        enc = new JpegBitmapEncoder();

    enc.Frames.Add(BitmapFrame.Create(rtb));
    enc.Save(fs);

    size = fs.Length;
}

但是当我创建这样的图像时,它会将图像的一部分保存在临时文件夹中。 (如上图所示)

如何调整全图的大小?我在这里错过了什么?

编辑: 正如 Erti-Chris Eelmaa 提到的上述答案中所述,我已将代码更改如下。它的工作原理......

UIElement uie = CanvasHost.Child;
int width = DataCache.Instance.CurrentProject.MaxPhotoEdgeSize;
int height = (int)((width / (double)((FrameworkElement)uie).Width) * (int)((FrameworkElement)uie).Height);

RenderTargetBitmap rtb = new RenderTargetBitmap((int)((FrameworkElement)uie).Width, (int)((FrameworkElement)uie).Height, 96, 96, PixelFormats.Pbgra32);
rtb.Render(uie);

ImageSource im = (ImageSource)rtb.Clone();
BitmapFrame bp = CreateResizedImage(im, width, height, 1); //method suggested by Erti-Chris Eelmaa
string dir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\temp\";

if (!Directory.Exists(dir))
    Directory.CreateDirectory(dir);

long size = 0;

string filePath = dir + DateTime.Now.Ticks.ToString() + (isPng ? ".png" : ".jpg");
BitmapEncoder enc = null;

using (FileStream fs = File.Create(filePath))
{
    if (isPng)
         enc = new PngBitmapEncoder();
    else
         enc = new JpegBitmapEncoder();


    enc.Frames.Add(BitmapFrame.Create(bp));
    enc.Save(fs);

    size = fs.Length;
}

【问题讨论】:

  • 位图创建后需要修改高度和宽度。你在这里做的是你正在制作一个小尺寸的新位图并用原始图片填充它而不调整大小。您创建一个原始大小的位图,然后使用它的高度和宽度来改变它的大小。
  • @FaisalHafeez 你能解释更多吗?我怎样才能调整它的大小
  • 这里你正在制作一个宽度和高度大小的位图。现在它的尺寸减小了。但是当你用图像填充它时,它只会复制图像的一部分(这发生在你的情况下)。您需要使用其他一些功能来实现这一点。
  • @FaisalHafeez 你能建议我在这里做什么吗?
  • 试试Erti提供的方案,效果不错。

标签: c# wpf image image-resizing


【解决方案1】:

至于调整大小本身,使用 WPF 的 TransformedBitmap 似乎更容易一些:

var bitmap = new TransformedBitmap(bitmapSource, 
    new ScaleTransform(
        newWidth / bitmapSource.PixelWidth, 
        newHeight / bitmapSource.PixelHeight));

【讨论】:

  • 我想说 - 容易多了 :)
【解决方案2】:

只需使用此方法获取BitmapFrame,然后使用PngBitmapEncoder将其保存到HDD即可。

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

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

    var drawingVisual = new DrawingVisual();
    using (var drawingContext = drawingVisual.RenderOpen())
        drawingContext.DrawDrawing(group);

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

    return BitmapFrame.Create(resizedImage);
}

【讨论】:

  • 我用过这个功能,你的意思是用RenderTargetBitmap代替PngBitmapEncoder r8?如果是这样,我该如何保存enc.Frames.Add(BitmapFrame.Create(rtb));,因为在这里它需要视觉对象。
  • 我编辑了我的问题。当我这样保存时,它会保存黑色图片。这是为什么呢?
猜你喜欢
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 2010-11-20
相关资源
最近更新 更多