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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2013, 22:23   #1
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию Сохранение нарисованного изображения

Допустим имеется программа для редактирования изображений. Изображение рисуется в самом окне (имеется ввиду что не на элементе упр-я). Так вот как сохранить измененное изображение в новый файл?
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 22.03.2013, 22:30   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Открыть файл, записать данные, закрыть файл...
waleri вне форума Ответить с цитированием
Старый 22.03.2013, 23:48   #3
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Гениально....Что записывать? Как получить то что записывать с окна? Или только издеваться умеешь
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 23.03.2013, 00:20   #4
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
По умолчанию

Цитата:
Изображение рисуется в самом окне (имеется ввиду что не на элементе упр-я)
Это типа карандашом на мониторе? Написал бы, как оно там рисуется, что-ли. Язык хотя бы скажи. Туманный вопрос-туманный и ответ...

Цитата:
Допустим имеется программа для редактирования изображений
Ну, если программа уже имеется, то тогда смотри к ней инструкцию, вот что я скажу.
monolit111 вне форума Ответить с цитированием
Старый 23.03.2013, 13:07   #5
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Да какая разница как оно рисуется. Вопрос в том как сохранить картинку с окна. WINAPI нужно или С++

Ответ нашел. Спасибо за содержательные ответы

Цитата:
Сообщение от monolit111 Посмотреть сообщение
Ну, если программа уже имеется, то тогда смотри к ней инструкцию, вот что я скажу.
Да ага. Инструкция к моей же написанной программе. Пойду в инете поищу, может её написали раньше, чем саму программу
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось Stilet; 27.03.2013 в 23:21.
kineziz вне форума Ответить с цитированием
Старый 23.03.2013, 14:38   #6
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
По умолчанию

Цитата:
моей же написанной программе
. Тогда странно, что ты не можешь определить в своей же собственной программе где у тебя хранятся данные(то бишь - изображение). Значит ты где-то скопировал кусок кода, не задумываясь, что он там вообще делает - хотя и в этом случае разобраться где что лежит не всегда прямо очень сложно...
Цитата:
WINAPI нужно или С++
- одно другого не исключает, но судя по всему ты сам не знаешь, на чем свою же программу писал(походу все-таки С++, но хз, хз)...
monolit111 вне форума Ответить с цитированием
Старый 23.03.2013, 15:05   #7
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Цитата:
Сообщение от monolit111 Посмотреть сообщение
. Тогда странно, что ты не можешь определить в своей же собственной программе где у тебя хранятся данные(то бишь - изображение). Значит ты где-то скопировал кусок кода, не задумываясь, что он там вообще делает - хотя и в этом случае разобраться где что лежит не всегда прямо очень сложно...
Копирование не использую.

Блин это проще показать чем объяснить

Код:
HBITMAP hBitmap = LoadBitmap(hTheme,MAKEINTRESOURCE(IDB_BITMAP));
HDC hDC = GetDC(hWnd);
HDC hMemDC = CreateCompatibleDC(hDC);
SelectObject(hMemDC,hBitmap);
BitBlt(hDC,20,20,10,25,hMemDC,0,0,SRCCOPY);
DeleteDC(hMemDC);
//
// Далее что то делаем с изображением, ну допустим рисуем линию
//
КАК СОХРАНИТЬ ИЗМЕНЕННОЕ ИЗОБРАЖЕНИЕ В ФАЙЛ
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 23.03.2013, 16:23   #8
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
По умолчанию

Я не полностью уверен, то в приведеном участке ты просто загружаешь изображение и выводишь его на экран. Также могу предположить, что механизма рисования линии у тебя пока тоже нету, или ты его тщательно скрываешь - но скорее первое. Вот когда он будет - тогда можно будет говорить и о сохранении(точнее, все будет ясно, ведь этот загадочный массив пикселей будет тебе известен, и тогда просто
Цитата:
Открыть файл, записать данные, закрыть файл
). Тебе не с экраном работать надо, а с данными, с битмапом этим...Я не знаю там, к примеру, отслеживать координаты мышки в окне и в соответствии с этим изменять массив пикселей(типа значения менять, ага)...
monolit111 вне форума Ответить с цитированием
Старый 24.03.2013, 17:26   #9
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Цитата:
Сообщение от monolit111 Посмотреть сообщение
Также могу предположить, что механизма рисования линии у тебя пока тоже нету, или ты его тщательно скрываешь - но скорее первое. Вот когда он будет - тогда можно будет говорить и о сохранении(точнее, все будет ясно, ведь этот загадочный массив пикселей будет тебе известен, и тогда просто ).
Код:
LineTo(hDC,10,10);
Пойдет? Или еще нужно описать как эта функция работает. И вообще причем тут механизм рисовании линии с сохранением изображения. Где связь? Если я тебе напишу весь механизм ты напишешь этот код:

Код:
void SaveBMP () {
	BITMAPFILEHEADER bfh; //структура с заголовком файла
	BITMAPINFOHEADER bih;	//структура с описанием формата картинки
	BITMAPINFO bi;	//описание формата для функции GetDIBits ()
	void *pdwBits = NULL; //указатель на буфер с будущим рисунком
	DWORD dwWB = 0; //переменная для хранения записанных байт в файл
	HANDLE hFile = NULL; //хэндл открытого файла
	
	//Создаем пустой буфер, в который потом скопируется картинка
	pdwBits = (void *)GlobalAlloc (GMEM_FIXED, 800 * 600 * 4);
	
	//Обнуляем структуры
	memset (&bfh, 0, sizeof (BITMAPFILEHEADER));
	memset (&bih, 0, sizeof (BITMAPINFOHEADER));
	memset (&bi, 0, sizeof (BITMAPINFO));
	
	//Заполняем заголовочную структуру
	bfh.bfType = 0x4D42;                           // Обозначим, что это bmp 'BM'
	bfh.bfOffBits = sizeof(bfh) + sizeof(bih);    
	bfh.bfSize = bfh.bfOffBits + 800 * 600 * 4;   // Посчитаем размер конечного файла
	
	//Заполняем описание картинки
	bih.biSize = sizeof(bih);                      // Так положено
	bih.biBitCount = 32;                           // 16 бит на пиксель
	bih.biCompression = BI_RGB;                    // Без сжатия
	bih.biHeight = 600;
	bih.biWidth = 800;
	bih.biPlanes = 1;     
	
	//Копируем в структуру BITMAPINFO
	CopyMemory (&bi, &bih, sizeof (BITMAPINFOHEADER));   
	
	//Получаем с помощью функции саму картинку из контекста в памяти
	GetDIBits (cwinDC, bmpMem, 0, 600, pdwBits, (LPBITMAPINFO)&bi, DIB_RGB_COLORS);
	
	//Создаем файл для записи
	hFile = CreateFile ("save.bmp", 
											GENERIC_WRITE, 
											0,
											NULL,
											CREATE_ALWAYS,
											FILE_ATTRIBUTE_NORMAL,
											(HANDLE)NULL);
	if (hFile == INVALID_HANDLE_VALUE) {
			if (pdwBits) GlobalFree (pdwBits);
			SetWindowText (hwndMain, "Ошибка при открытии файла");
			return;
		}
	
	//Записываем структуру с заголовком файла
	if (!WriteFile (hFile, (void *)&bfh, sizeof (BITMAPFILEHEADER), &dwWB, NULL)) {
		SetWindowText (hwndMain, "Ошибка при записи BITMAPFILEHEADER");
		if (pdwBits) GlobalFree (pdwBits);
		return;
	}
	
	//Записываем структуру с описанием формата картинки
	if (!WriteFile (hFile, (void *)&bih, sizeof (BITMAPINFOHEADER), &dwWB, NULL)) {
		SetWindowText (hwndMain, "Ошибка при записи BITMAPINFOHEADER");
		if (pdwBits) GlobalFree (pdwBits);
		return;
	}	
	
	//Записываем собсна саму картинку после двух предыдущих структур
	if (!WriteFile (hFile, (void *)pdwBits, 800 * 600 * 4, &dwWB, NULL)) {
		SetWindowText (hwndMain, "Ошибка при записи DIBits");
		if (pdwBits) GlobalFree (pdwBits);
		return;
	}	
	
	//Закрываем хэндл файла и очищаем буфер
	CloseHandle (hFile);
	if (pdwBits) GlobalFree (pdwBits);
	return;
}
Вот код сохранения битмапа (на др. форуме ответили быстрее и без мех-ма рисования). Теперь скажи причем тут механизм рисования линий???
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось kineziz; 24.03.2013 в 17:29.
kineziz вне форума Ответить с цитированием
Старый 27.03.2013, 18:00   #10
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
По умолчанию

Код:
LineTo(hDC,10,10);
Все потому что эту линию ты рисуешь, грубо говоря, на экране, а не на изображении. Вот так вот. А это разные вещи. Тебе нужно обращаться напрямую к пикселам изображения, массив которых у тебя должен быть.
monolit111 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение изображения в БД shturman1387 БД в Delphi 5 21.12.2012 17:20
сохранение изображения ВалекFCRK Общие вопросы Delphi 9 26.09.2011 21:49
Сохранение нарисованного рисунка в графический файл Lawrence Общие вопросы .NET 5 09.09.2010 16:23
Сохранение нарисованного на картинке Aries Помощь студентам 2 09.05.2010 00:33
сохранение изображения dedyshka Свободное общение 2 21.11.2009 23:43