Добавление пробела в верхнюю часть изображения с использованием заданного hDC

Макет:

Я использую сторонние элементы управления для сканирования документов. У меня есть событие, которое происходит, когда я сканирую изображение (в основном используется для добавления аннотаций к изображению). Событие предоставляет мне только одно свойство с именем .PAhDC. Это свойство является дескриптором контроллера домена, в котором хранится изображение до его записи в файл. Таким образом, я могу вносить изменения в изображение до того, как оно будет записано в файл.

Ожидаемые результаты:

Я хотел бы просто добавить 1/4 дюйма (скажем, 100 пикселей) пробела в самый верх изображения. Если мое исходное изображение имеет размер 200x200 (ШxВ), тогда мое новое окончательное изображение должно быть 200x300.

Вопрос и другие мысли:

Как я могу изменить существующее изображение, зная только его дескриптор DC? Я думал сделать что-то вроде следующего ...

  1. Создайте новый DC.
  2. Создайте новое изображение Bitmap на 100 пикселей выше исходного изображения.
  3. Используйте это новое растровое изображение в новом DC.
  4. Скопируйте исходное изображение в новое растровое изображение (100 пикселей сверху в качестве начальной точки).
  5. Затем используйте что-то вроде SelectObject для замены старого растрового изображения в исходном hDC новым, а затем уничтожьте старый растровый объект.

Примечание: я хотел бы делать это как можно чаще с УПРАВЛЯЕМЫМ КОДОМ. Использование SelectObject () было единственным способом, который я мог придумать, но это, конечно, неуправляемый код ...: /


person Arvo Bowen    schedule 31.10.2012    source источник


Ответы (2)


Невозможно без сотрудничества с владельцем растрового изображения и DC.

DeviceContext - это просто область просмотра базового DIB / растрового изображения и не имеет понятия о размере или размерах (за пределами области отсечения). Хотя вы можете создать новое растровое изображение и выбрать его в DC, весьма вероятно, что приложение просто проигнорирует то, что вы сделали и используете созданный им DIB. Конечным результатом этого будет утечка объекта GDI и отсутствие изменений в базовом изображении.

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

person Deanna    schedule 01.11.2012
comment
Мне никогда не удавалось заставить его работать, и, как говорит Дина, независимо от того, что я делаю с растровым изображением в DC (заменяя его или нет), мои изменения игнорируются, потому что новое растровое изображение игнорируется обратно в родительской функции ... Или так Я предполагаю, из-за того, что он подошел, когда я пытаюсь поменять растровое изображение. - person Arvo Bowen; 02.11.2012

Конечно, вы можете сделать это в управляемом коде. Все объявления P / Invoke легко доступны в любой приличной поисковой системе.

  • При создании нового контроллера домена убедитесь, что он совместим с исходным.
  • При создании нового растрового изображения убедитесь, что оно совместимо с DC
person Johann Gerell    schedule 31.10.2012