Member 12822233 Ответов: 3

Сохранение изображения в буфер обмена


Следуя фрагменту, найденному на форуме, мне удалось преобразовать растровое изображение в PNG-файл. Однако мне нужно скопировать это изображение в буфер обмена.

См. фрагмент ниже:

INT convertPNG(HBITMAP img)
{
	GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR gdiplusToken;
	GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

	{ // Diese Klammer ist erforderlich weil der Destruktor von bmp vor GdiplusShutdown
	  // aufgerufen werden muss
		Bitmap *image = new Bitmap(img, NULL);

		// Save the image.
		CLSID pngClsid;
		GetEncoderClsid(L"image/png", &pngClsid);
		image->Save(L"mypngImg.png", &pngClsid, NULL);
	}

	GdiplusShutdown(gdiplusToken);

	return 0;
}


Что я уже пробовал:

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

Я могу открыть буфер обмена, но это все, что я знаю на данный момент.

Simon Ferry

вау, интересный результат

3 Ответов

Рейтинг:
2

Member 12822233

Я просмотрел документацию по буферу обмена, которая показывает пример вставки текста в буфер обмена здесь: Использование буфера обмена (Windows)[^]

Все это хорошо, но как я могу сделать то же самое с изображением, как описано выше?


Рейтинг:
1

CPallini

Я бы начал с документации: Буфер обмена в MSDN[^]. Вероятно, вам придется использовать частный формат буфера обмена для ваших данных.


Рейтинг:
1

Jochen Arndt

Как объяснено в статье MSDN Использование буфера обмена, вы должны скопировать данные в выделенную глобальную память и вызвать SetClipboardData передача формата буфера обмена и дескриптора глобальной памяти.

Поскольку стандартного формата буфера обмена для изображений PNG не существует, вам необходимо зарегистрировать формат буфера обмена с помощью Функция RegisterClipboardFormat[^]. Обычно используются "PNG "и" image/png " (тип MIME).

При наличии изображения в виде файла загрузите его в выделенную память (непроверенный пример кода без проверки ошибок):

// Get the file size
struct _stat st;
stat(fileName, &st);
// Allocate buffer and read data
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, st.st_size);
LPVOID pGlobal = GlobalLock(hGlobal);
FILE *f = fopen(fileName, "rb");
fread(pGlobal, 1, st.st_size, f);
fclose(f);
GlobalUnlock(hGlobal);
// Register clipboard format
UINT cf = RegisterClipboardFormat("PNG");
// Put it on the clipboard.
// The global memory is owned by the clipboard and will be freed when
//  new data is put on the clipboard.
OpenClipboard(hWnd);
EmptyClipboard();
SetClipboardData(cf, hGlobal);
CloseClipboard();

При использовании MFC вы также можете использовать CImage класс для создания PNG-изображения в виде IStream и поместите это в буфер обмена с помощью COleDataSource класс.