Я хочу, чтобы мое приложение (которое работает с изображениями RGBA8888) позволяет вставлять изображения из буфера обмена Windows. Таким образом, он должен иметь возможность считывать изображения из буфера обмена, которые поступают из любых распространенных приложений растрового изображения, таких как Gimp, Photoshop, MSPaint и т. Д.Получить 32-битное изображение RGBA из буфера обмена Windows
От чтения функций буфера обмена, кажется, я могу позвонить GetClipboardData(CF_DIBV5)
в получить доступ практически к любому растровому типу, который находится в буфере обмена, поскольку Windows автоматически преобразует его в CF_BITMAP и CF_DIB. Но после чтения в формате DIB я вижу, что существует огромное количество возможных комбинаций битовой глубины, порядка RGB, дополнительного сжатия и т. Д. Похоже, что то, что я делаю, будет обычной задачей, но я не знаю, я вижу какие-либо функции преобразования в Windows API (если я не беден в поиске), и это похоже на то, что потребуется неделя, чтобы писать для поддержки всех возможных форматов. Поэтому мне интересно, не упустил ли я что-то очевидное. Или если есть какое-то предположение, которое я могу сделать, чтобы упростить это ... например, если все популярные приложения для изображений будут копировать изображения в буфер обмена в несжатых/неиндексированных форматах.
UPDATE: Вот что я до сих пор:
HGLOBAL clipboard = GetClipboardData(CF_DIBV5);
exists = clipboard != NULL;
int dataLength = GlobalSize(clipboard);
exists = dataLength != 0;
if (exists) {
LPTSTR lockedClipboard = GlobalLock(clipboard);
exists = lockedClipboard != NULL;
if (exists) {
BITMAPV5HEADER *header = (BITMAPV5HEADER*)lockedClipboard;
LONG width = header->bV5Width;
LONG height = header->bV5Height;
BYTE *bits = header + sizeof(header) + header->bV5ClrUsed * sizeof(RGBQUAD);
//Now what? Need function to convert the bits to something uncompressed.
GlobalUnlock(clipboard);
}
}
UPDATE 2:
Чтобы уточнить, мне нужно буквально несжатого 32 бит данных изображения (RRGGBBAA), которые я могу манипулировать однако Мне нравится в кросс-платформенном приложении. Мне не нужно использовать Windows API для рисования этого изображения.
Я знаю о сторонней библиотеке под названием stdb_image.h
, которая может загружать .bmps, .jpg и .png в тип данных, который мне нужен. Поэтому, если есть способ, я могу превратить данные буфера обмена в растровые или png-файлы, не теряя альфа, тогда я буду в хорошей форме.
'GetDIBits' и' SetDIBits' преобразуют растровые данные между DIB и DDB, преобразуя их в соответствии с параметрами из 'BITMAPINFO'. – GSerg
'GetClipboardData (CF_BITMAP)' должно быть достаточно, если вам не нужны уровни альфа-прозрачности. Покажите, что вы сделали до сих пор и какие проблемы у вас есть с определенными программами (Microsoft paint.exe не должно быть проблемой) –
Я работаю над пониманием функции getDIBits и обновляюсь, если не могу заставить ее работать. Мне нужна альфа. Похоже, что для неиндексированных растровых изображений альфа находится в четвертом байте (каждый пиксель должен использовать длинный, хотя и только RGB), но в заголовке нет ничего, чтобы определить, есть ли альфа. – Tenfour04