Загрузите и объедините два изображения в WPF - PullRequest
0 голосов
/ 17 мая 2011

Я пытаюсь написать приложение, которое создает изображение с водяным знаком из загруженного JPEG в WPF. Я хочу загрузить в WPF изображение в формате JPEG и нарисовать его с помощью предварительно определенного PNG с прозрачной областью над. Я попытался создать два изображения в качестве RenderTargetBitmap, а затем создать новый RenderTargetBitmap, например

Image LoadSource(string file) {
  var image = new Image();
  var src = new BitmapImage(); 
  src.BeginInit(); 
  src.UriSource = new Uri(file, UriKind.Absolute);
  src.CacheOption = BitmapCacheOption.OnLoad;
  src.EndInit();
  image.Source = src;
  image.Stretch = Stretch.Uniform;
  image.Width = 1024;
  image.Height = 768;
  return image;
}

private void Window_Loaded(object sender, RoutedEventArgs e) {
  var imgA = LoadSource(@"D:\test\1.jpg");
  var imgB = LoadSource(@"D:\test\2.png");
  var bmp = new RenderTargetBitmap(1024, 768, 120, 96, PixelFormats.Pbgra32);
  bmp.Render(imgA);
  bmp.Render(imgB);
  ResultImage.Source = bmp;
}

но это не работает.

Может кто-нибудь указать мне на решение?

1 Ответ

2 голосов
/ 17 мая 2011

У меня есть более простое решение:

XAML:

<DockPanel>
    <Button DockPanel.Dock="Bottom" HorizontalAlignment="Right" 
            Margin="12" Click="ButtonSave_OnClick" Content="_Save" />
    <Grid Name="MergedImage" Width="1024" Height="768" 
            HorizontalAlignment="Center" VerticalAlignment="Center" 
            AllowDrop="True" DragOver="MergedImage_DragEnter" 
            Drop="MergedImage_Drop">
        <Image Name="SourcePicture"/>
        <Image Source="Watermark.png"/>
    </Grid>
</DockPanel>

Код позади:

void ButtonSave_OnClick(object sender, RoutedEventArgs e)
{
    var dialog = new Microsoft.Win32.SaveFileDialog 
    { 
        DefaultExt = ".jpg", 
        Filter = "Image (.jpg)|*.jpg" 
    };

    if (dialog.ShowDialog() == true)
    {
        // Save my merged image as jpeg.
        // SaveAsJpeg(MergedImage, dialog.FileName);
    }
}

private void MergedImage_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        var fileNames = (string[])e.Data.GetData(DataFormats.FileDrop, true);
        if (fileNames.Length == 1)
        {
            var file = new FileInfo(fileNames[0]);
            if (file.Extension.ToLower() == ".png" ||
                file.Extension.ToLower() == ".bmp" ||
                file.Extension.ToLower() == ".jpg" ||
                file.Extension.ToLower() == ".jpeg" ||
                file.Extension.ToLower() == ".gif")
            {
                e.Effects = DragDropEffects.Copy;
                e.Handled = true;
                return;
            }
        }
    }
    e.Effects = DragDropEffects.None;
    e.Handled = true;
}

private void MergedImage_Drop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        var fileNames = (string[])e.Data.GetData(DataFormats.FileDrop, true);
        SourcePicture.Source = new BitmapImage(new Uri(fileNames[0], 
            UriKind.Absolute));
        Application.Current.MainWindow.Activate();
    }
}
...