Изменить кодировку изображений динамически? - PullRequest
1 голос
/ 14 сентября 2009

Я хочу знать, возможно ли программно изменить кодировку изображения на лету, не сохраняя изображение в файл?

Вариант использования : Когда пользователь копирует двоичное изображение из источника, можно ли будет изменить кодировку изображения с binary на base64?

Ответы [ 3 ]

4 голосов
/ 14 сентября 2009

Вы можете изменить кодировку изображения, не сохраняя его в файл, но не сохраняя его в переменной своего кода. Класс 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 голос
/ 14 сентября 2009

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

Если это так, вам следует искать вызовы Win32 API для подключения к буферу обмена, чтобы фоновое приложение могло обрабатывать скопированные данные до того, как они станут доступны для вставки.

Эта статья может помочь вам:

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

1 голос
/ 14 сентября 2009

Использование нового класса ClipBoard в WPF

Приведенный ниже пример читает поток из файла, но вы можете использовать любой поток

        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

...