首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拖放VSTO 2013插件中的图像透明度

拖放VSTO 2013插件中的图像透明度
EN

Stack Overflow用户
提问于 2014-04-09 12:34:31
回答 1查看 418关注 0票数 0

我的PowerPoint外接程序中有一个WPF控件,它承载了一个我希望能够拖放到活动幻灯片上的图像。我可以让图像显示在幻灯片上,但透明区域是用黑色渲染的。

我用来初始化附加行为的拖拽的代码:

代码语言:javascript
复制
var targetBitmap = new RenderTargetBitmap(
    (int) MyWpfControl.ActualWidth,
    (int) MyWpfControl.ActualHeight,
    96d, 96d, PixelFormats.Default);

targetBitmap.Render(MyWpfControl);

var dataObject = new DataObject(
    DataFormats.Bitmap, 
    targetBitmap);

DragDrop.DoDragDrop(MyWpfControl, dataObject, DragDropEffects.Copy)

考虑到我可能需要传递一个System.Drawing.Image,我尝试了这个修改,这只会导致透明区域呈现为灰色:

代码语言:javascript
复制
var targetBitmap = new RenderTargetBitmap(
    (int) MyWpfControl.ActualWidth,
    (int) MyWpfControl.ActualHeight,
    96d, 96d, PixelFormats.Default);

targetBitmap.Render(MyWpfControl);

var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(targetBitmap));

var ms = new MemoryStream();
encoder.Save(ms);

var dataObject = new DataObject(DataFormats.Bitmap, Image.FromStream(ms, true))
DragDrop.DoDragDrop(MyWpfControl, dataObject, DragDropEffects.Copy)

我做了一个测试,我用一个文件流替换了内存流,写入的图像确实具有正确的透明度。

那么我在这里错过了什么呢?我怎样才能保持透明度?

EN

回答 1

Stack Overflow用户

发布于 2014-04-09 12:54:10

我按照this blog post中的说明解决了这个问题。解决方案是在我的DataObject中使用EnhancedMetafile DataFormat。

编辑:

下面是启动拖动操作的代码。

代码语言:javascript
复制
private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Bitmap bitmap = ImageToBitmap(e.Source as System.Windows.Controls.Image);

    DataObject data = new DataObject(DataFormats.EnhancedMetafile, MakeMetafileStream(bitmap));

    DragDrop.DoDragDrop((DependencyObject)e.Source, data, DragDropEffects.Copy);
}

这将使用实用程序函数将图像转换为位图:

代码语言:javascript
复制
private Bitmap ImageToBitmap(System.Windows.Controls.Image image)
{
    RenderTargetBitmap rtBmp = new RenderTargetBitmap((int)image.ActualWidth, (int)image.ActualHeight,
        96.0, 96.0, PixelFormats.Pbgra32);

    image.Measure(new System.Windows.Size((int)image.ActualWidth, (int)image.ActualHeight));
    image.Arrange(new Rect(new System.Windows.Size((int)image.ActualWidth, (int)image.ActualHeight)));

    rtBmp.Render(image);

    PngBitmapEncoder encoder = new PngBitmapEncoder();
    MemoryStream stream = new MemoryStream();
    encoder.Frames.Add(BitmapFrame.Create(rtBmp));

    // Save to memory stream and create Bitamp from stream
    encoder.Save(stream);

    return new System.Drawing.Bitmap(stream);
}

这还需要一个实用函数,该函数将位图转换为包含从堆栈溢出中获取的图元文件的流。

//来自Convert an image into WMF with .NET?

代码语言:javascript
复制
private MemoryStream MakeMetafileStream(Bitmap image)
{
    Graphics graphics = null;
    Metafile metafile = null;
    var stream = new MemoryStream();
    try
    {
        using (graphics = Graphics.FromImage(image))
        {
            var hdc = graphics.GetHdc();
            metafile = new Metafile(stream, hdc);
            graphics.ReleaseHdc(hdc);
        }
        using (graphics = Graphics.FromImage(metafile))
        { graphics.DrawImage(image, 0, 0); }
    }
    finally
    {
        if (graphics != null)
        { graphics.Dispose(); }
        if (metafile != null)
        { metafile.Dispose(); }
    }
    return stream;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22952865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档