3

私は次のようなばかげたアプリケーションを開発しています。-メディアライブラリから画像を開きます。-選択した画像をグリッド要素(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");
    }

私は新しいユーザーなので写真を投稿できません。とにかく写真(元の写真と保存された写真)の高さと幅は同じですが、見た目が異なります。問題はグリッドの寸法とストレッチプロパティにあると思います。別のコンボを試しましたが、結果は良くありませんでした。いくつかの提案?

編集:私は評判ポイントを獲得しました元の写真は 元の写真

保存された写真は 保存した写真

両方を別のウィンドウで開くと、違いがわかります

4

1 に答える 1

1

問題を理解するのは非常に簡単です。基本的には、グリッドの「スクリーンショット」を作成しています。したがって、生成される画像のサイズはグリッドのサイズと同じになります。したがって、ダウンサンプリングされた画像。

ただし、それを修正するのは難しい場合があります。2 つの方法を提案できます。

  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);
    
于 2012-10-18T21:19:17.670 に答える