在WinRT中调整大小时图像像素化

时间:2012-10-21 08:44:44

标签: c# image windows-runtime

我正在开发一款使用大量图片的WinRT应用。在图像的一部分中,我显示了具有更大版本的图像缩略图。

这些缩略图的图像源是各自的大图像,1024x768。重新调整大小是在C#中动态完成Image元素上的缩略图。我也保持了4:3的宽高比。

这是WinRT调整图像大小的唯一方法吗?还是可以用更少的像素化更优雅地动态调整图像元素的大小?

P.S:我也无法创建较小版本的图像,原因之一是缩略图的大小是动态的,具体取决于屏幕上的缩略图数量和屏幕分辨率。

这是我的自动调整大小代码。

private void canvasObject()
    {
        for (int i = 1; i <= maxCards; i++)
        {
            objectList.Add(i); 
        }

        Double h,w, hp=0,wp=0,hm;
        w = ((objectCanvas.ActualWidth / 9));
        h = (w * (4 / 3));
        hm = ((objectCanvas.ActualHeight / 3)-h);
        int count = 0;

        for (int i = 0; i <= 3;i++)
        {
            wp = 0;
            for (int j = 0; j < 9 && count < maxCards; j++)
            {
                count++;
                Card c = new Card();
                ImageSource imgSrc1;
                Random rnd = new Random();
                int rNum = rnd.Next(1, objectList.Count);
                imgSrc1 = new BitmapImage(new Uri(@"ms-appx:/Assets/Images/Alphabets/Cards/" + (char)(objectList[rNum-1] + 96) + ".png", UriKind.Absolute));
                c.objectImg.Name = objectList[rNum-1].ToString();
                objectList.Remove(objectList[rNum-1]);
                c.objectImg.SetValue(Image.SourceProperty, imgSrc1);
                c.objectImg.Width = w;
                c.objectImg.Height = h;
                c.objectImg.Margin = new Thickness(10);
                c.objectImg.SetValue(Canvas.LeftProperty,wp);
                c.objectImg.SetValue(Canvas.TopProperty, hp);
                wp += w;
                c.objectImg.Tapped += objectImg_Tapped;
                objectCanvas.Children.Add(c.objectImg);
            }
            hp += h+hm;
        }
    }

以为我觉得这不是代码的问题,因为XAML中的一些图像看起来也像素化,即使它们被拉伸到Uniform。我甚至尝试使用较小的图像到他们的确切大小,但我的应用程序上显然小的图像正在按原样像素化。但是当在2560x1440 res上运行时,图像看起来像预期的那样。

2 个答案:

答案 0 :(得分:2)

您尝试过使用ScaleTransform吗?

ScaleTransform st = new ScaleTransform();
st.Scale = 0.20f; 
c.objectImg.RenderTransform = st;

在缩放和旋转图像时,我发现变换最有用。

答案 1 :(得分:1)

我有同样的问题,但为此找到了一个非常巧妙的解决方案。关键字为DecodePixelHeight

<Image Width="100" Height="100" Stretch="UniformToFill">
   <Image.Source>
     <BitmapImage DecodePixelWidth="100" UriSource="{Binding ImagePath}" />
   </Image.Source>
</Image>

信用证转到:http://www.geekchamp.com/forums/windows-8-development/resizing-an-image-without-losing-any-quality-in-windows-store-app#forum-post-386827