WP7如何使网格尺寸适应图像尺寸

时间:2012-10-18 13:17:57

标签: c# silverlight windows-phone-7

我正在开发一个愚蠢的应用程序: - 从媒体库中打开图片, - 将所选图像放入网格元素(包含TextBlok元素) - 将照片保存在“已保存的照片”相册中。

我的XAML代码是:

<controls:PanoramaItem Header="Image Selection" Height="652">
<Grid Name="markedImage" Margin="0,0,4,89">
    <Image x:Name="img" Stretch="Fill" Margin="0,0,0,10"></Image>
    <TextBlock x:Name="text" Text="Hello!">
        <i:Interaction.Behaviors>
            <el:MouseDragElementBehavior ConstrainToParentBounds="True"/>
        </i:Interaction.Behaviors>
    </TextBlock>
</Grid>

打开并保存所选图片的代码是:

private void photoChooserTask_Completed(object sender, PhotoResult e)
    {
        try
        {
            BitmapImage image = new BitmapImage();
            image.SetSource(e.ChosenPhoto);
            WriteableBitmap wbp = new WriteableBitmap(image);
            this.img.Source = image;
            height = image.PixelHeight;
            width = image.PixelWidth;
            MessageBox.Show("H: " + height + "\t" + "W: " + width);
        }
        catch 
        { 
            MessageBox.Show("Disconnect your device from Zune"); 
        }
    }
private void save_Click(object sender, System.EventArgs e)
    {

        WriteableBitmap marked = new WriteableBitmap(this.markedImage, null);
        ThreadPool.QueueUserWorkItem(callback =>
        {
            MemoryStream ms = new MemoryStream();
            marked.SaveJpeg(ms, (width * 2), (height * 2), 0, 100);
            using (MediaLibrary lib = new MediaLibrary())
                lib.SavePicture("Test", ms.ToArray());
        });
        MessageBox.Show("H: " + marked.PixelHeight + "\t" + "W: " + marked.PixelWidth);

        // wbm.SaveToMediaLibrary("SavedPicture.jpg", true);

        MessageBox.Show("Picture saved successfully");
    }

我无法发布图片,因为我是新用户,无论如何图片(orignal和已保存的图片)具有相同的高度和宽度但它们看起来不同 我认为问题是网格维度和Stretch属性。我尝试了不同的组合但结果并不好。 一些建议?

编辑:我赢得了声望点 原始的照片是 original pics

保存的照片是 saved pics

如果你在另一个窗口打开,你可以看到差异

1 个答案:

答案 0 :(得分:1)

问题很容易理解:基本上,你正在对你的网格做一个“截图”。因此,生成的图片的大小与网格的大小相同。因此,下采样图片。

然而,修复它可能会很棘手。我可以建议两种方式:

  1. 以编程方式在代码隐藏中重新创建网格及其内容,然后从此新网格创建WriteableBitmap

  2. 在执行图像生成代码之前从其父控件中删除网格(然后网格将能够根据需要使用尽可能多的空间),然后将其添加回来:

    <Grid x:Name="ParentGrid" Grid.Row="1" Width="200" Height="150">
        <Grid Name="markedImage" Margin="0,0,4,89">
            <Image x:Name="img" Source="Images/Test.jpg" Stretch="Fill" Margin="0,0,0,10"></Image>
            <TextBlock x:Name="text" Text="Hello!">
                <i:Interaction.Behaviors>
                    <el:MouseDragElementBehavior ConstrainToParentBounds="True"/>
                </i:Interaction.Behaviors>
            </TextBlock>
        </Grid>
    </Grid>
    

    代码隐藏:

    this.ParentGrid.Children.Remove(this.markedImage);
    
    WriteableBitmap marked = new WriteableBitmap(this.markedImage, null);          
    
    MemoryStream ms = new MemoryStream();
    marked.SaveJpeg(ms, 1349, 1437, 0, 100);
    using (MediaLibrary lib = new MediaLibrary())
        lib.SavePicture("Test", ms.ToArray());
    
    MessageBox.Show("H: " + marked.PixelHeight + "\t" + "W: " + marked.PixelWidth);
    
    MessageBox.Show("Picture saved successfully");
    
    this.ParentGrid.Children.Add(this.markedImage);