Win32应用程序使像素变为全蓝色,红色或绿色

时间:2012-01-12 04:43:02

标签: c++ file winapi image-processing bitmap

大家好,所有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 :(得分:0)

您的评论非常正确。每个元素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;常量。

答案 1 :(得分:0)

我认为该文件是.BMP。除了像素数据,它还有你需要读取的标题,还要注意像素行被填充到32-bti边界。你需要考虑到这一切。在线查找示例代码/代码段,例如: