Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2015, 02:20   #1
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию Graphics to Bitmap

Здравствуйте, спрошу уже тут, авось кто-знает. Гугл чего то пасует ...
В общем задача такая:
Есть функция в которую приходит объект Graphics.

Код:
private void SomeFunc(Graphics gfx)
{
// тут нужно получить объект Bitmap из этого графикса.

Bitmap btm = gfx.TomBitmap(); ??? что то такое хотелось бы
}
Подскажите пожалуйста такое возможно сотворить??
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 14.06.2015, 03:06   #2
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 821
По умолчанию

Это разве не то https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx ?
^-.-^ My GitHub
Fenex вне форума Ответить с цитированием
Старый 14.06.2015, 08:52   #3
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Этот метод лишь задает DPI, ничего больше. Он не копирует картинку.
Объект Graphics не содержит информацию об отрисованной графике. Вам нужен Image, чтобы что-то сделать с готовым изображением, логичнее передавать его.
Если всё же необходимо сделать именно так, как вы написали, то копайте в сторону Graphics.GetHdc() - вы получите handle реального контейнера графики, с которым дальше можно работать через WinAPI.
Вероятно, вам понадобится эта функция:
Код:
[DllImport("gdi32.dll")]
public static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 14.06.2015, 20:37   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Selestis Посмотреть сообщение
Этот метод лишь задает DPI, ничего больше. Он не копирует картинку.
Объект Graphics не содержит информацию об отрисованной графике

Ну ведь когда вызываются методы отрисовки то он же куда то рисует. То есть какой то буфер должен быть. Искал через рефлексию но все поинтеры которые нашел вызывают ошибку при попытке создать из них картинку.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 14.06.2015, 20:44   #5
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Код:
куда то рисует
Да. В HDC - контекст устройства. В шарпе обёрткой для всего этого является Image, и именно поэтому есть метод
Код:
Graphics.FromImage
.
А не наоборот, как хотите вы. HDC по идее даёт вам всю необходимую информацию, чтобы достать картинку (только это HDC не Graphics, а Image'а, для которого она была создана), но разумеется не стандартными средствами .NET, а функциями WinAPI.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 14.06.2015, 20:44   #6
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Fenex Посмотреть сообщение
Нет. После этого сохраняется черное изображение.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 14.06.2015, 20:50   #7
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Selestis Посмотреть сообщение
Код:
куда то рисует
Да. В HDC - контекст устройства. В шарпе обёрткой для всего этого является Image, и именно поэтому есть метод
Код:
Graphics.FromImage
.
А не наоборот, как хотите вы. HDC по идее даёт вам всю необходимую информацию, чтобы достать картинку (только это HDC не Graphics, а Image'а, для которого она была создана), но разумеется не стандартными средствами .NET, а функциями WinAPI.
Код
Код:
Image img = Image.FromHbitmap(e.Graphics.GetHdc());
                img.Save("C:\\hdc.jpg");
Вызывает ошибку.
А можно поподробнее узнать что за объект расположен по ссылке HDC?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 14.06.2015, 21:13   #8
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

HBITMAP - это не HDC, поэтому и не работает =) В C# все эти вещи имеют просто тип IntPtr, даже если они отвечают за совершенно разные вещи...
HDC = Handle of a Device Context. Он предоставляет доступ к графической информации на т.н. "устройстве", в нашем случае ваша картинка, на которой рисует Graphics.
Алгоритм действия (примерно):
1) получить у графики HDC
2) создать пустой Bitmap с тем же размером
3) получить у новой картинки её HDC
4) вызвать BitBlt для копирования исходной картинки (hdcSrc) в новую (hdc).
Возможно необходимы какие-то промежуточные действия вроде блокировок, но это я точно не скажу, последний раз писал такое очень давно)
А вообще почитайте про WinAPI, там много интересного. Того, что "под капотом" windows forms.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 14.06.2015, 22:48   #9
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Selestis Посмотреть сообщение
HBITMAP - это не HDC, поэтому и не работает =) В C# все эти вещи имеют просто тип IntPtr, даже если они отвечают за совершенно разные вещи...
HDC = Handle of a Device Context. Он предоставляет доступ к графической информации на т.н. "устройстве", в нашем случае ваша картинка, на которой рисует Graphics.
Алгоритм действия (примерно):
1) получить у графики HDC
2) создать пустой Bitmap с тем же размером
3) получить у новой картинки её HDC
4) вызвать BitBlt для копирования исходной картинки (hdcSrc) в новую (hdc).
Возможно необходимы какие-то промежуточные действия вроде блокировок, но это я точно не скажу, последний раз писал такое очень давно)
А вообще почитайте про WinAPI, там много интересного. Того, что "под капотом" windows forms.
Спасибо. Но параметров изображения за пределами гарфикса я не знаю.
Но в любом случае получается что овчинка выделки не стоит в данном случае.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
graphics.h в VS 2010... Andrey141 Visual C++ 2 28.11.2012 07:15
graphics.h victor5133 Помощь студентам 0 26.10.2011 19:25
<graphics.h> Ислам Помощь студентам 4 28.06.2011 09:31
из-за чего появляется полоса (на скрине) при вставке BitMap в TImage? - Проблема с Bitmap Grey@2009 Мультимедиа в Delphi 2 02.01.2010 20:23
graphics.h C++ ROD Помощь студентам 3 21.12.2008 20:09