Приложение Win32 получает пиксели для изменения на синий, красный или зеленый цвет - PullRequest
0 голосов
/ 12 января 2012

Привет всем экспертам C ++,

Это снова я. Я сразу перейду к делу.

Я успешно получил пиксель растрового изображения в цветах RGB (синий - 178, зеленый - 130 и красный - 131).

Что я хочу сделать дальше, так это перебрать пиксели и сделать так, чтобы изображение было полностью синим. (Например, синий - 255, зеленый - 0, красный - 0)

Я пробовал пару циклов for, но это не работает, поэтому требуется помощь!

/*for (int i = 0; i < test; i++) 
{ 
image[i].rgbtBlue; 
image[i].rgbtGreen; 
image[i].rgbtRed; 
}*/ 

Но, очевидно, это не работает, поэтому мне нужна была помощь. Чтобы добавить это, hfile инициализировался для других целей, поэтому я не думал, что это актуально. Оценил все комментарии, спасибо.

Спасибо! Ниже приведен код.

P.S .: Использование Microsoft Visual Studio 2010 - приложение Win32, а не консоль.

#include "stdafx.h"
#include "winmain.h"
#include "Resource.h"
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <CommDlg.h>
#include <stdint.h>
#include <string>
#include <WinGDI.h>

HANDLE hfile2; 
DWORD written; 
BITMAPFILEHEADER bfh; 
BITMAPINFOHEADER bih; 
RGBTRIPLE *image;

hfile2 = CreateFile(ofn.lpstrFile`, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_FLAG_OVERLAPPED, NULL);
//Read the header
ReadFile(hfile, &bfh, sizeof(bfh), &written, NULL);
ReadFile(hfile, &bih, sizeof(bih), &written, NULL);

// Read image
int imagesize = bih.biWidth * bih.biHeight; // Helps you allocate memory for the image
image = new RGBTRIPLE[imagesize]; // Create a new image (I'm creating an array during runtime
ReadFile(hfile, image, imagesize * sizeof(RGBTRIPLE), &written, NULL); // Reads it off the disk
get_pixel(bih.biWidth, bih.biHeight);
int test = bih.biHeight * bih.biWidth * bih.biBitCount;

RGBTRIPLE get_pixel(int x,int y)
{
    // Image define from earlier
    return image[(bih.biHeight-1-y)*bih.biWidth+x];
}

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Я предполагаю, что файл .BMP.Помимо данных пикселей, у него также есть заголовки, которые вам нужно прочитать, а также обратите внимание, что линии пикселей дополняются до границы 32 бита.Вы должны принять это все во внимание.Ищите примеры кода / фрагментов в Интернете, например:

0 голосов
/ 12 января 2012

Ваш комментарий в значительной степени прав.Каждый элемент image[i] является RGBTRIPLE переменной, которую вы можете читать и записывать.Следовательно, setpixel является простым:

void set_pixel(int x,int y, RGBTRIPLE color)
{
    image[(bih.biHeight-1-y)*bih.biWidth+x] = color;
}

Вы видите, что тот же код используется для выбора правильного пикселя изображения.Возможно, вы захотите определить const RGBTRIPLE blue; константу.

...