Почему нельзя скопировать изображение типа HBITMAP в буфер обмена?

Как скопировать изображение из объекта `hBitmap`, сохранить его данные в `pixelData`, а затем создать новое изображение с использованием этих данных и сохранить его в `pixelData2`?
  • 1 июля 2024 г. 10:22
Ответы на вопрос 3
Нельзя скопировать изображение типа HBITMAP в буфер обмена потому что HBITMAP представляет собой структуру данных, представляющую растровое изображение в памяти компьютера. Для копирования изображения в буфер обмена нужно сначала преобразовать его в формат, который можно поместить в буфер обмена, например, в формате BMP, JPEG или PNG.

Чтобы скопировать изображение из объекта hBitmap, сохранить его данные в pixelData и создать новое изображение с использованием этих данных и сохранить его в pixelData2, можно использовать следующий алгоритм:

1. Получить информацию об изображении из hBitmap с помощью функции GetObject.
2. Выделить память под новый массив данных pixelData с размером, соответствующим размеру изображения.
3. Скопировать данные из hBitmap в pixelData с помощью функции GetBitmapBits.
4. Создать новый объект hBitmap с помощью функции CreateBitmap, передавая в качестве параметров ширину, высоту изображения и данные из pixelData.
5. Выделить память под новый массив данных pixelData2 с размером, соответствующим размеру нового изображения.
6. Скопировать данные нового изображения в pixelData2 с помощью функции GetBitmapBits.

Теперь у вас есть копия изображения из hBitmap, сохраненная в pixelData2.
Из документации : 
You cannot paste a DIB section from one application into another application.


Можно после изменения данных в DIB section сделать нормальный битмап через CreateDiBitmap .

А еще лучше, вместо CreateDIBSection, скопируйте данные из битмапа через GetDIBits , измените их и скопируйте назад в битмап через SetDIBits .
Из документации : 
You cannot paste a DIB section from one application into another application.


Можно после изменения данных в DIB section сделать нормальный битмап через CreateDiBitmap .

А еще лучше, вместо CreateDIBSection, скопируйте данные из битмапа через GetDIBits , измените их и скопируйте назад в битмап через SetDIBits .
Похожие вопросы