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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2012, 19:08   #1
napster1991
 
Регистрация: 15.03.2010
Сообщений: 9
По умолчанию работа с изображением (.bmp)

Есть изображение размера n*n формата bmp (24-разрядный). Нужно получить доступ к каждому пикселю изображения, т.е. в матрице n*n сохранить значение пикселей.
Далее по желанию меняем эти значения и сохраняем в другом файле измененное изображение.

при возможности с примером, пожалуйста.
заранее благодарен...

PS: работаю на Visual Studio 2008 (это на всякий случай )
napster1991 вне форума Ответить с цитированием
Старый 17.11.2012, 09:30   #2
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Накидал по-быстрому.
Код:
#include <stdio.h>
#include <windows.h>

BITMAPINFO* Open24DIB(const TCHAR* filename);
BOOL  Save24DIB(const TCHAR* filename, BITMAPINFO* dib);
void  Draw24DIB(HDC hDC, int x, int y, BITMAPINFO* dib);
void  Free24DIB(BITMAPINFO* dib);

int main(){

	// открыть
	BITMAPINFO* dib = Open24DIB(TEXT("C:\\src.bmp"));
	if(dib == NULL)
		return 1;

	RGBTRIPLE* rgb;
	BYTE step;

	BYTE* ptr = (PBYTE)dib + *(DWORD*)dib;

	/* доступ к массиву пикселей по координатам x,y получаем таким образом
	int x = 10;
	int y = 30;
	rgb = (RGBTRIPLE*)((ptr) + (y * dib->bmiHeader.biWidth + x) * sizeof(RGBTRIPLE));*/

	// обработаем изображение "появление из тьмы"
	for(long y = 0L; y < dib->bmiHeader.biHeight; y++) {

		step = (BYTE)MulDiv(y, 255, dib->bmiHeader.biHeight);

		for(long x = 0L; x < dib->bmiHeader.biWidth; x++) {
			rgb = (RGBTRIPLE*)((ptr) + (y * dib->bmiHeader.biWidth + x) * sizeof(RGBTRIPLE));
			rgb->rgbtRed   = max(rgb->rgbtRed   - step, 0);	
			rgb->rgbtGreen = max(rgb->rgbtGreen - step, 0);
			rgb->rgbtBlue  = max(rgb->rgbtBlue  - step, 0);
		}
	}

      // показать результат работы на дисплей
	HWND w = GetForegroundWindow();
	HDC  d = GetDC(w);
	Draw24DIB(d, 1, 1, dib);
	ReleaseDC(w, d);

	// сохранить в другой файл
	Save24DIB(TEXT("C:\\dst.bmp"), dib);

	Free24DIB(dib);
	
	getchar();
        return 0;
}


// загрузка 24-битного DIB-файла
BITMAPINFO* Open24DIB(const TCHAR* filename) {

	HANDLE fp = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, 
		                   OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if(fp == INVALID_HANDLE_VALUE)
		return NULL;

	BITMAPFILEHEADER finfo;
	DWORD dread = 0uL;
	ZeroMemory(&finfo, sizeof(BITMAPFILEHEADER));
	ReadFile(fp, (LPVOID)&finfo, sizeof(BITMAPFILEHEADER), &dread, NULL);
	if(finfo.bfType != 0x4D42) {
		CloseHandle(fp);
		return NULL;
	}
	
	BITMAPINFOHEADER info;
	ZeroMemory(&info, sizeof(BITMAPINFOHEADER));
	ReadFile(fp, (LPVOID)&info, sizeof(BITMAPINFOHEADER), &dread, NULL);
	if((info.biBitCount != 24u) || (info.biCompression != BI_RGB)) {
		CloseHandle(fp);
		return NULL;
	}

	BITMAPINFO*  dib = (BITMAPINFO*) new BYTE[finfo.bfSize];
	if(dib == NULL) {
		CloseHandle(fp);
		return NULL;
	}
	SetFilePointer(fp, sizeof(BITMAPFILEHEADER), NULL, FILE_BEGIN);
	ReadFile(fp, (LPVOID)dib, finfo.bfSize, &dread, NULL);
	CloseHandle(fp);
	return dib;
}


// сохранение 24-битного DIB
BOOL  Save24DIB(const TCHAR* filename, BITMAPINFO* dib) {

	if(dib == NULL)
		return FALSE;

	HANDLE fp = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, 
		                   CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	if(fp == INVALID_HANDLE_VALUE)
		return FALSE;

	BITMAPFILEHEADER finfo;	
	DWORD dwrite = 0uL;
	ZeroMemory(&finfo, sizeof(BITMAPFILEHEADER));
	finfo.bfType    = 0x4D42;
	finfo.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
	finfo.bfSize    = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dib->bmiHeader.biSizeImage;

	WriteFile(fp, (LPCVOID)&finfo, sizeof(BITMAPFILEHEADER), &dwrite, NULL);
	WriteFile(fp, (LPCVOID)&dib->bmiHeader, sizeof(BITMAPINFOHEADER), &dwrite, NULL);

	PBYTE ptr = (PBYTE)dib + *(DWORD*)dib;
	WriteFile(fp, (LPCVOID)ptr, dib->bmiHeader.biSizeImage, &dwrite, NULL);
	FlushFileBuffers(fp);
	CloseHandle(fp);
	return TRUE;
}

// вывод в контекст
void  Draw24DIB(HDC hDC, int x, int y, BITMAPINFO* dib) {
	if(dib == NULL)
		return;
	PBYTE ptr = (PBYTE)dib + *(DWORD*)dib;
	SetDIBitsToDevice(hDC, x, y, dib->bmiHeader.biWidth, dib->bmiHeader.biHeight, 0, 0, 
		                 dib->bmiHeader.biPlanes, dib->bmiHeader.biHeight, (LPVOID)ptr, dib, 0); 
}


// очистка
void  Free24DIB(BITMAPINFO* dib) {
	if(dib == NULL)
		return;
	delete[] (LPBYTE)dib;
}
Nuklon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с изображением vladislav_m Общие вопросы Delphi 4 07.04.2012 11:02
Работа с изображением Claster Помощь студентам 6 16.03.2011 10:16
работа с изображением Андрей.12 Фриланс 5 05.05.2010 19:55
Работа с изображением za4ot Мультимедиа в Delphi 16 08.04.2008 22:27
Работа с изображением Artem PHP 4 20.10.2007 15:56