J'ai créé une application WPF à l'aide du contrôle WPF de Bing maps. Je voudrais pouvoir capturer uniquement le contrôle des cartes Bing.
Utilisez ce code pour faire la capture d'écran:
// Store the size of the map control
int Width = (int)MyMap.RenderSize.Width;
int Height = (int)MyMap.RenderSize.Height;
System.Windows.Point relativePoint = MyMap.TransformToAncestor(Application.Current.MainWindow).Transform(new System.Windows.Point(0, 0));
int X = (int)relativePoint.X;
int Y = (int)relativePoint.Y;
Bitmap Screenshot = new Bitmap(Width, Height);
Graphics G = Graphics.FromImage(Screenshot);
// snip wanted area
G.CopyFromScreen(X, Y, 0, 0, new System.Drawing.Size(Width, Height), CopyPixelOperation.SourceCopy);
string fileName = "C:\\myCapture.bmp";
System.IO.FileStream fs = System.IO.File.Open(fileName, System.IO.FileMode.OpenOrCreate);
Screenshot.Save(fs, System.Drawing.Imaging.ImageFormat.Bmp);
fs.Close();
Mon problème:
Width
et Height
semblent être mauvais (fausses valeurs). La capture d'écran produite semble utiliser de mauvaises coordonnées.
Ma capture d'écran:
Ce que j'attends:
Pourquoi est-ce que j'obtiens ce résultat? J'ai essayé en mode Release, et sans Visual Studio, le résultat est le même.
Une capture d'écran est une vue de l'écran ... tout sur l'écran. Ce que vous voulez, c'est enregistrer une image à partir d'un seul UIElement
et vous pouvez le faire en utilisant RenderTargetBitmap.Render
Méthode . Cette méthode prend un paramètre d'entrée Visual
et heureusement, c'est l'une des classes de base pour tous les UIElement
s. En supposant donc que vous souhaitiez enregistrer un fichier .png, vous pouvez procéder comme suit:
RenderTargetBitmap renderTargetBitmap =
new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
renderTargetBitmap.Render(yourMapControl);
PngBitmapEncoder pngImage = new PngBitmapEncoder();
pngImage.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
using (Stream fileStream = File.Create(filePath))
{
pngImage.Save(fileStream);
}