动态更改图像编码?

时间:2009-09-14 02:03:08

标签: c# image-processing image-manipulation

我想知道是否可以在不将图像保存到文件的情况下以编程方式动态更改图像编码?

使用案例:当用户从源复制二进制图片时,是否可以将图像编码从binary更改为base64

3 个答案:

答案 0 :(得分:4)

您可以更改图像的编码而不将其保存到文件中,但不能将其保存到代码中的变量中。 Clipboard类基本上只有一些Get和Set方法。更改剪贴板中的内容的唯一方法是将其中一个Get方法调用到局部变量中,更改您刚刚获得的任何内容,然后调用其中一个Set方法,传入更改的对象。这会导致更改剪贴板对象,但不能没有将其“保存”到变量的中间步骤。

剪贴板不会公开任何直接操作剪贴板中对象内存的方法。即使这样的方法暴露,将图像的编码从二进制更改为Base64也会从根本上改变内存的所有,因此对它没有多大价值

更新:这是一个从剪贴板中获取图像,将其转换为base64字符串并将其放回剪贴板的方法:

if (Clipboard.ContainsImage())
{
    using (MemoryStream memory = new MemoryStream())
    {
        using (Image img = Clipboard.GetImage())
        {
            img.Save(memory, img.RawFormat);
        }
        string base64 = Convert.ToBase64String(memory.ToArray());
        Clipboard.SetText(base64);
    }
}

你需要使用这两个语句:

using System.IO;
using System.Windows.Forms;

它未经测试(因为它已经过了我的睡觉时间),但它应该有效。它确实涉及使用局部变量,但这是不可避免的(以及正常)。

答案 1 :(得分:1)

在WPF中使用新的ClipBoard类

以下示例从文件中读取流,但您可以使用任何流

        var image = new BitmapImage();

        image.BeginInit();
        image.StreamSource = File.Open("image.png", FileMode.Open);
        image.EndInit();

        System.Windows.Clipboard.SetImage(image);

http://msdn.microsoft.com/en-us/library/system.windows.clipboard.setimage.aspx

答案 2 :(得分:1)

我认为您可能会询问如何拦截复制操作并使用新内容替换剪贴板的逻辑内容,所有这些都来自某个后台应用程序,而不是如何替换分配给原始复制操作的内存字节。 / p>

如果是这样,你应该寻找Win32 API调用来挂钩到剪贴板,以便后台应用程序可以处理复制的数据,然后才能进行粘贴。

这篇文章可能会让你:

http://www.radsoftware.com.au/articles/clipboardmonitor.aspx