1

VS 2008 3.5 フレームワークを使用して WPF に pgn ファイルをロードする際に問題が発生しています。ファイルは正常に読み込まれて表示されますが、サイズがずれています。私は他の質問を調査し、さまざまな提案を試みましたが、役に立ちませんでした。

36 x 50 の pgn ファイルのイメージから始めました。次に、Windows ペイントを使用してサイズを 29 x 40 に縮小しました。それを System.Windows.Media.Imaging.Bitmap オブジェクトにロードし、それを次のように使用します。 System.Windows.Controls.Image オブジェクトのソース。画像を表示すると、ペイントの同じ画像よりも大きく表示されます。問題を解決するために私が行ったことは次のとおりです。

  1. 読み込まれたファイルの幅と高さが適切であることを確認しました。デバッガーでビットマップ オブジェクトを調べたところ、幅 = 29、高さ = 40 と表示されています。このリンクのコードからシステム dpi が 96 に設定されていることを確認しました。

  2. ストレッチ = なしに設定します。効果がありませんでした。

  3. System.Drawing.Image オブジェクトを使用して、pgn ファイルの水平および垂直解像度を表示しようとしました。どちらも 96 に設定されています。

  4. 一部のファイル イメージで pgn ファイル圧縮プログラムである pgnout を使用してみました。また、画像の解像度を 96 に設定することも想定されています。表示される画像のサイズには影響しませんでした。

  5. 異なるサイズの画像に対して表示されるサイズを比較してみました。表示される高さは 31 ピクセルのようです。幅は約 34 ピクセルです。Paint.Net や Gimp などの他のエディターを使用してみましたが、ペイントと同じ結果が得られます。

私はアイデアが不足しています。私が見る唯一の回避策は、ペイントに移動し、すべての画像を小さいサイズに再調整して、WPF で表示したときに適切なサイズになるようにすることです。

pgn ファイルを読み込んでイメージを作成するコードは次のとおりです。

private void LoadCardbackBitmapFromFile()
{
   // This method loads the cardback image from the pgn file.
   //
   string CardBackFileName = AppSettings.CardsbackFolder + @"\" + AppSettings.CardsBackFileName + AppSettings.CardsBackIndex.ToString() + ".png";
   // Check if the file exists.
   if (!File.Exists(CardBackFileName))
   {
      StringBuilder SBLog = new StringBuilder("AttackPoker2::Cards::Cards - unrecoverable error - could not find the card back file " + CardBackFileName.ToString() + ".\n");
      SSLSocketInterface.LogMsgCPP(SBLog, LogLevel.LogInfo);
      string S = "Unrecoverable error - could not find the card back file " + CardBackFileName.ToString() + ".\nInstallation may be corrupt.  Try re-installing or re-locating the cards folder.";
      throw new ApplicationException(S);
   }
   CardbackBitmap = new BitmapImage();
   CardbackBitmap.BeginInit();
   CardbackBitmap.UriSource = new Uri(CardBackFileName, UriKind.Absolute);
   CardbackBitmap.CacheOption = BitmapCacheOption.OnLoad;
   CardbackBitmap.EndInit();
   CardbackImage = new Image();
   CardbackImage.Source = CardbackBitmap;
   CardbackImage.Stretch = Stretch.None;
   CardbackImage.VerticalAlignment = VerticalAlignment.Top;
   CardbackImage.HorizontalAlignment = HorizontalAlignment.Left;
}

private void CreateCardbackImages()
{
   // This method creates clones of the cardback image so that they can be displayed simultaneously.  WPF does not provide the capability to reuse ui objects.
   //
   for (int SeatLoop = 0; SeatLoop < NumSeats; SeatLoop++)
   {
      for (int CardLoop = 0; CardLoop < NumPlayerCards; CardLoop++)
      {
         Image CBI = new Image();
         CBI.Source = CardbackImage.Source;
         CBI.Stretch = CardbackImage.Stretch;
         // Set the card so it is not viewable.
         CBI.Visibility = Visibility.Collapsed;
         CardbackImages[SeatLoop, CardLoop] = CBI;
         CardsGrid.Children.Insert(SeatLoop, CBI);
      }
   }
}
//
private Grid LayoutRoot; // The main ui grid.
private Grid CardsGrid; // Used to place the the card images.
private BitmapImage CardbackBitmap; // Used to hold the image read in from the pgn file.
private static Image CardbackImage; // Used to hold the original cardback image.
private Image[,] CardbackImages; // Holds the list of cardback images used to deal the cards to each player. 1st dim is the seat; 2nd dim is the card number.

XAML は次のとおりです。

<Window x:Class="A2.GameWindow" Width="600" Height="497"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Closing="GameWindow_Closing">
  <Viewbox HorizontalAlignment="Left" VerticalAlignment="Top" Stretch="Fill">
    <Grid Name="LayoutRoot">
      <Grid.RowDefinitions>
        <RowDefinition Height="0.85*"/>
        <RowDefinition Height="0.15*"/>
      </Grid.RowDefinitions>
         <Image Source="Table Green.png" Stretch="Fill"/>
         <TabControl Grid.Row="1" FontSize="9" FontFamily="Fonts/#Segoe UI Semibold" FontWeight="Bold">
          <TabItem Header="Chat">
            <StackPanel>
              <TextBox Name="TxtTyping" Width="193.75" FontSize="8" MaxLines="1" Margin="-285,0,0,0"></TextBox>
              <TextBox Name="TxtMessages" Width="193.75" Height="64.125" FontSize="8" Margin="-285,0,0,0" Background="#FFC8F0EC"></TextBox>
            </StackPanel>
          </TabItem>
          <TabItem Header="Notes">
            <StackPanel>
              <ComboBox Name="NotesCombo" Width="193.75" Margin="-285,0,0,0"></ComboBox>
              <TextBox Name="TxtNotesMessages" Width="193.75" Height="64.125" Margin="-285,0,0,0"></TextBox>
            </StackPanel>
          </TabItem>
          <TabItem Header="Stats">
              <TextBox Name="TxtStats" Width="193.75" Height="64.125" Margin="-285,0,0,0" Background="#FFC8F0EC"></TextBox>
          </TabItem>
           <TabItem Header="Info">
              <TextBox Name="TxtInfo" Width="193.75" Height="64.125" Margin="-285,0,0,0" Background="#FFC8F0EC"></TextBox>
          </TabItem>
        </TabControl>
      </Grid>
    </Viewbox>
</Window>

誰が問題が何であるかについて何か考えがありますか? ペイントやその他の画像エディターと同じサイズの画像を WPF で表示するにはどうすればよいですか? 私は何か間違ったことをしていますか?任意の提案をいただければ幸いです。

4

1 に答える 1

1

ここでほぼ同じ質問: WPF: 元のサイズで画像を表示する方法は?

Stretch="None" は、画像のスケールを 100% に保ちます。

ImageBox のサイズを画像と同じサイズに変更することもできます。

いくつかのサンプル:

アスペクト比を維持するには

imageBox.Stretch="None"

サイズを変更するには:

imageBox.Width = myImage.Width ;
imageBox.Height = myImage.Height;

最大サイズを制限するには:

if (imageBox.ActualHeight > 500)
    imageBox.Height = 500;

if (imageBox.ActualWidth > 800)
     imageBox.Width = 800;
于 2013-06-04T14:07:13.487 に答える