【问题标题】:How to resize the images without disturbing the aspect ratio如何在不影响纵横比的情况下调整图像大小
【发布时间】:2014-03-13 19:44:28
【问题描述】:

我正在处理Windows 8 Phone app,我的应用程序中显示了一些图像,我拥有的图像非常大且质量很好,现在在我的应用程序中我需要在不影响宽高比的情况下调整图像大小。

我已经搜索过了,找不到合适的灵魂。

如何做到这一点?

这是我在 .CS 文件中的代码。

string imageName= "path to folder" + name + ".png";
BitmapImage bmp = new BitmapImage(new Uri(imageName, UriKind.Relative));
Image.Source = bmp;

编辑

更多信息:目前我在我的列表框中显示图像,所以图像看起来很大,所以我想在不影响图像纵横比的情况下将其减小到较小的尺寸。

【问题讨论】:

  • 你对调整大小的图像做了什么?目的是为了在屏幕上以较小的尺寸显示它们吗?如果是这样,则无需生成另一个图像。
  • @WaltRitscher 是的,我有大尺寸的图像,但我想以看起来不错的小尺寸显示它们,如果你在屏幕上渲染之前,我需要获取图像的高度和宽度有答案请发表你的答案

标签: c# wpf image windows-phone-8 windows-phone


【解决方案1】:

图像元素的大小受其包含面板的影响,但这应该适用于任何面板。

<Grid>
    <Image Source='flower.png' Width='120' Stretch='Uniform'/>
  </Grid>

【讨论】:

    【解决方案2】:

    如果您想将缩小的图像加载到内存中,请设置 DecodePixelWidth 而不设置 DecodePixelHeight(或其他方式)

    BitmapImage bitmapImage = new BitmapImage();
    bitmapImage.DecodePixelWidth = 80; 
    bitmapImage.UriSource = new Uri(imageName, UriKind.Relative);
    

    编辑

    或者,如果您想将高分辨率图像保留在内存集大小中以供Image 控制。

    <Image ... Width="80"/>
    

    Stretch 属性默认设置为Uniform,这意味着:

    内容会调整大小以适应目标尺寸,同时保留其原始纵横比。

    【讨论】:

    • 你能解释一下它如何不会影响图像的质量,我是 Windows 8 应用程序开发的新手
    • 那么你是想缩小它以供查看,并将高分辨率图像保留在内存中还是保留在内存中?
    • 保持纵横比与保持质量不同。您是想在内存中保留高分辨率图像并缩小它以供查看(保持纵横比)还是在内存中减小其大小以保持纵横比。
    • 好的,在这种情况下,大图像已经存在于应用程序的某个文件夹中,所以现在我只需要减小大图像的大小并显示,但提供了图像不应该模糊
    • 我尝试了您的解决方案,但图像看起来很模糊
    【解决方案3】:

    如果您想在显示时按比例缩小图像大小,请尝试使用 Image 控件的 Stretch 属性,如 this blog post 中的演示和解释非常好。

    <Image x:Name="Image" Stretch="UniformToFill"></Image>
    

    【讨论】:

      【解决方案4】:

      应该这样做:

      static void Main(string[] args)
          {
              int _newWidth = 60; //the new width is set, the height will be calculated
      
              var originalImage = Bitmap.FromFile(@"C:\temp\source.png");
      
              float factor = originalImage.Width / (float)_newWidth;
              int newHeight = (int)(originalImage.Height / factor);
      
              Bitmap resizedImage = ResizeBitmap(originalImage, _newWidth, newHeight);
      
              resizedImage.Save(@"c:\temp\target.png");
          }
      
          private static Bitmap ResizeBitmap(Image b, int nWidth, int nHeight)
          {
              Bitmap result = new Bitmap(nWidth, nHeight);
              using (Graphics g = Graphics.FromImage(result))
                  g.DrawImage(b, 0, 0, nWidth, nHeight);
              return result;
          }
      

      【讨论】:

      • 你能解释一下它如何不会影响图像的质量,我是 Windows 8 应用程序开发的新手
      • 看起来你正在将图像保存在 C 驱动器中:这里 resizedImage.Save(@"c:\temp\target.png"); ,但正如我在这里提到的,我正在开发 Windows 8 手机应用程序
      • 不确定windows phone 8,但我想加载它将是Bitmap.FromStream并保存resizedImage.Save(stream)
      • 所以这不适用于 Windows Phone 8 应用程序,对吧?
      • 我想经过你的编辑,har07的答案会更好
      猜你喜欢
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2013-05-12
      • 2010-12-03
      • 2013-10-13
      • 1970-01-01
      相关资源
      最近更新 更多