Image img(L"xxxxjpg");
graphicsTranslateTransform(600,10);//平移
graphicsRotateTransform(25);//旋转
graphicsDrawImages(&img,0,0,a,b);//a,b放大的大小
另外,站长团上有产品团购,便宜有保证在<Windowsh>这个头文件中定义了Bmp文件头。
在baikebaiducom中(BMP格式)详细解释了Bmp文件头的结构。
我在这里就再给你解释一下吧:
// bmp文件的文件结构是:
struct BMP
{
struct BITMAPFILEHEADER
{
WORD bfType; // 永远是"BM"
DWORD bfSize; // 整个bmp文件的大小
WORD bfReserved1; // 永远是0
WORD bfReserved2; // 永远是0
DWORD bfOffBits; // bmp文件头的大小,此值 = sizeof (BMP)(用这个可以计算出下面的调色板的大小)
}fileHeader;
struct BITMAPINFO
{
BITMAPINFOHEADER infomationHeader; // bitmap信息头
RGBQUAD bmiColors[1/fileHeaderbfOffBits - sizeof ( infomationHeader )-sizeof ( fileHeader )/]; // 长度可变的调色板
}bitmapInfomation;
char bits[1/imageSize/]; // 像素矩阵
};
一个struct BMP就是整个bmp文件里所包含的内容。
所以,你只需要填充struct BMP,然后把它写入bmp文件就可以了。
一般步骤可以分为三大步:
针对你的情况:
// 1:填充信息头
你说的像素点灰度数据,就是像素矩阵里的数据。如果你的灰度数据是0-255之间的,那就是占8位。按微软定义的Bmp文件的要求,8位位图必须使用调色板。你要做的只是按要求填充BITMAPFILEHEADER。然后填充BITMAPINFO里的BITMAPINFOHEADER,这个结构关键的是这个(其他都顾名思义,就不用说了吧):
infomationHeaderbiBitCount = 8; // 8位位图
// 2:填充调色板
然后,因为是8位位图,调色板中应该包含2^8 = 256个RGBQUAD结构,分别对应索引为0~255的颜色值。
如果要成像好一些,例如PS等专业软件,一般调色板的调配会是不规则的,用一些算法算出来的。
不过我们就不用那么苛刻了。直接按顺序给他们分配相应的灰度颜色即可。这样也正好让调色板的索引对上你的图像的灰度值,便可以直接把你的灰度图像复制到像素矩阵里了:
for ( int i = 0; i < 255 ; i++ )
bmiColors[i]rgbBlue = bmiColorsGreen[i] = bmiColorsRed[i] = i;
// 3:复制像素矩阵,写入文件
我们把调色板做得比较特别,所以可以把你的灰度图,直接复制到像素矩阵里。
memcpy ( );
最后,写入文件就好了。
祝你学习愉快^_^以pPicture 取得你这个的高与宽
建一个同样大小的设备兼容位图,然后pPicture->Render 其中设备描述符句柄HDC使用这个
设备兼容位图的HDC作为参数,这样你的Picture就渲染到了这个设备兼容位图上,然后就是常规 *** 作了。如果你对设备兼容位图的 *** 作不清楚,就去看Win32程序设计这本书,百度文档上肯定有
看位图那章,很多例子的。只要是在电脑上绘图,你的长度都不可能是小数,因为不存在小数个像素的说法,所以即使你传的是小数作为绘图参数,MFC也是会作相应的舍入处理,所谓的绘图,说白了就是让屏幕上的某些像素点按照你设置的颜色来显示罢了。
只要是计算机上跑的软件(CAD也不例外),它不可能绘出长度为小数的物理(比例尺1:1)线条的,这是硬件上的限制,但软件是可以弥补的(其实只是让你误以为而已,通常的做法是修改比例尺,局部放大,类似CAD、电子地图等功能)追问:首先创建一个位图句柄,类型为CBitmap,把加载到资源中,用LoadBitMap函数,参数是资源号。(另一种方法是先把文件加载,然后在载入到一个位图类中,用LoadImage函数,较上面种繁琐些。)
然后通过上面创建的位图,得到位图数据,用到GetBitmapBits(xy4, (LPVOID)data)函数,其中x,y为位图的长宽,data为保存位图数据的数组,类型为byte。完了之后,data数组中就包含着位图的所有RGB值,一个数据占四个字节(R、G、B、NULL)。剩下的事就好办了,要寻找某点,逐一排查是否和数组中的数据相同即可。
今天太晚了,明天给你附代码。SetPixel或SetPixelV,需要知道其左、上坐标以及颜色值。
COLORREF SetPixel(
HDC hdc, // handle to DC
int X, // x-coordinate of pixel
int Y, // y-coordinate of pixel
COLORREF crColor // pixel color
);
hdc:
HDC hdc = CreateDC(TEXT("DISPLAY",NULL,NULL,NULL);
或
HDC hdc = ::GetDC(::GetDesktopWindow());
释放HDC
DeleteDC对应CreateDC
ReleaseDC对应GetDC首先问一下,你是用DDB(设备相关位图)还是Dib类(设备无关位图类,得自己写)进行图像处理的呢?
如果是用前者,以下是灰度处理菜单响应函数
void CBTTMAPView::256ToGray()
{
// TODO: Add your command handler code here
CDC pDC=this->GetDC(); //获得设备上下文
CRect m_rect;
this->GetClientRect(&m_rect); //获得窗口客户区
COLORREF m_color;
BYTE r,g,b;
DWORD m_gray;
for(int i=0;i<(int)(m_rectbottom);i++)
for(int j=0;j<(int)
( m_rectright);j++)
{
m_color=pDC->GetPixel(i,j); //获得颜色
r=GetRValue(m_color);
g=GetGValue(m_color);
b=GetBValue(m_color);
m_gray=(int)(038r+049g+01b);//设置灰度颜色值
m_color=RGB(m_gray,m_gray,m_gray);
pDC->SetPixel(i,j,m_color); //用灰度颜色画点
}
主要是利用CDC类对象的两个成员函数GetPixel和SetPixel来设置图像像素点的颜色值
如果用Dib类处理,实在是抱歉,由于我也是初学者,最近在用MFC做一个图像处理,不太清楚!位图,也叫BitMap,其数据区存储的就是每个像素点的RGB值。如果要读取每个像素点的颜色,那么通过位图指针的偏移计算,就可以直接获取每个点的颜色值。
如果是已经显示在DC的位图,那么可以通过GetPixel函数获取指定位置的颜色。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)