CreateCompatibleBitmap是生成内存兼容位图
CreateBitmap是生成一个位图句柄
CBitmap::CreateBitmapIndirect 函数创建位图成功却在CDC::SelectObject 选择位图时却失败,原因是CreateBitmapIndirect不能创建彩色位图,只能创建单色位图,虽然CreateBitmapIndirect创建彩色位图时也能返回成功,但用CDC::SelectObject 的时候失败。MSDN只有在CreateBitmapIndirect 有说明。
虽然CreateBitmapIndirect函数可用于创建彩色位图,出于性能方面的应用程序应该使用CreateBitmapIndirect创建单色位图,用CreateCompatibleBitmap创建彩色位图,详细方法请关注VC++ - CreateCompatibleBitmap()
要创建彩色位图应用 CreateCompatibleBitmap 函数
关于CreateBitmapIndirect BITMAP参数的bmBits 创建成功后返回0的问题
CBitmap::CreateBitmapIndirect函数的功能是用一个BITMAP结构体重的高度、宽度和位模式(如果指定了一个的话)来初始化一个位图。调用该函数时,用户可以设置bmBits字段为NULL或者设为像素位数据的地址(用以初始化该位图)。
如果位图已经通过LoadBitmap加载到内存,则内存中的图像与显示设备紧密相关,比如原图是彩色,显示器是黑白色,通过bmpLoadBitmap(我的)后,内存中的图像数据是黑白色的数据,而且还与显示器位数有关。如果需要在原位图数据上进行图像处理,就不要bmpLoadBitmap来加载位图,而是打开文件获取位图数据。如果仅仅是在当前显示设备下进行效果处理,则可以使用bmpLoadBitmap加载位图,通过CBitmap的GetBitmapBit函数可以获取位图数据,如果是24位显示器,则每3个字节表示一个像素,其中第一个字节是B,第二个字节是G,第3个字节是R;如果是32位的显示器,每4个字节表示一个像素,一般前3个字节与24位显示器一样,第4个字节一般没有什么意义。
Microsoft Visual C++,(简称Visual C++、MSVC、VC++或VC)是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互 *** 作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2,WinSock网络、3D控制界面。
它以拥有“语法高亮”,IntelliSense(自动完成功能)以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。这些特征明显缩短程式编辑、编译及连结花费的时间,在大型软件计划上尤其显著。
Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等 *** 作,并可以指定格式保存图像文件。本文从应用的角度,着重介绍怎么用Bitmap来实现这些功能。
一、Bitmap的生成
11 BitmapFactory decode出Bitmap
Bitmap实现在androidgraphics包中。但是Bitmap类的构造函数是私有的,外面并不能实例化,只能是通过JNI实例化。这必然是 某个辅助类提供了创建Bitmap的接口,而这个类的实现通过JNI接口来实例化Bitmap的,这个类就是BitmapFactory。
图一、BitmapFactory主要方法及Options选项
利用BitmapFactory可以从一个指定文件中,利用decodeFile()解出Bitmap;也可以定义的资源中,利用decodeResource()解出Bitmap。
12 decode时的选项
在使用方法decodeFile()/decodeResource()时,都可以指定一个BitmapFacotryOptions。
利用Options的下列属性,可以指定decode的选项:
inPreferredConfig 指定decode到内存中,手机中所采用的编码,可选值定义在BitmapConfig中。缺省值是ARGB_8888。
inJustDecodeBounds 如果设置为true,并不会把图像的数据完全解码,亦即decodeXyz()返回值为null,但是Options的outAbc中解出了图像的基本信息。
inSampleSize 设置decode时的缩放比例。
利用Options的这些值就可以高效的得到一幅缩略图。
图二、BitmapFactorydecodeFile()
先设置inJustDecodeBounds= true,调用decodeFile()得到图像的基本信息[Step#2~4];
利用图像的宽度(或者高度,或综合)以及目标的宽度,得到inSampleSize值,再设置inJustDecodeBounds= false,调用decodeFile()得到完整的图像数据[Step#5~8]。
先获取比例,再读入数据,如果欲读入大比例缩小的图,将显著的节约内容资源。有时候还会读入大量的缩略图,这效果就更明显了。
二、利用Bitmap和Matrix实现图像变换
Bitmap可以和Matrix结合实现图像的剪切、旋转、缩放等 *** 作。
图三、Bitmap方法
用源Bitmap通过变换生成新的Bitmap的方法:
public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height,
Matrix m, boolean filter)
public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height)
public static Bitmap createScaledBitmap(Bitmap src, int dstWidth,
int dstHeight,boolean filter)
第一个方法是最终的实现,后两种只是对第一种方法的封装。
第二个方法可以从源Bitmap中指定区域(x,y, width, height)中挖出一块来实现剪切;第三个方法可以把源Bitmap缩放为dstWidth x dstHeight的Bitmap。
设置Matrix的Rotate(通过setRotate())或者Scale(通过setScale()),传入第一个方法,可实现旋转或缩放。
图四、Bitmap实现旋转
三、保存图像文件
经过图像变换之后的Bitmap里的数据可以保存到图像压缩文件里(JPG/PNG)。
图五、保存Bitmap数据到文件
这个 *** 作过程中,Bitmapcompress()方法的参数format可设置JPEG或PNG格式;quality可选择压缩质量;fOut是输出流(OutputStream),这里的FileOutputStream是OutputStream的一个子类。
总结一下,本文介绍Bitmap的使用方法——用Bitmap实现图像文件的读取和写入,并用Bitmap实现图像的剪切、旋转和缩放变换。
先我们创建一个基于对话框的的工程suibian。然后再对话框中添加按钮。并单击右键,d出的对话框中设置位图,
,其他的都默认。然后右击插入你要用的,记住。要bmp格式的位图,的id设置默认吧。
然后打开类视图,点击这个函数bool
csuibiandlg::oninitdialog();
接着在 这行(//
todo:
add
extra
initialization
here)注释的后面添加如下代码
hbitmap
hbitmap=::loadbitmap(afxgetinstancehandle(),makeintresource(idb_bitmap1));//载入位图资源
m_bitmapbuttonsetbitmap(hbitmap);//设置按钮的位图资源
然后运行。就可以显示你的
//选择图像
CDC bmDC;
bmDCCreateCompatibleDC(ctrlDC);
bmDCSelectObject(m_hbm);
//然后
CBitmap pbit = bmDCGetCurrentBitmap();
BITMAP bitmapInfo;
pbit->GetObject(sizeof(BITMAP),&bitmapInfo);
//你看看BITMAP bitmapInfo;里面的结构,你想要的东西都在里面了
//还是推荐你看看windows 程序设计里面的位图部分,非常详尽
{
int x=5,y=5,width,height;//x,y是需要查找的点的坐标,从0开始
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);//启动GDI+,方便加载位图
Bitmap bmp(_T("E:\\cbmp"));
HBITMAP hBmp = NULL;
bmpGetHBITMAP(Color(0),&hBmp);//获取位图句柄
BITMAP bi = {0};
GetObject(hBmp,sizeof(BITMAP),&bi);//获取位图信息,包括深度,宽高,步长等
width = bibmWidth;height = bibmHeight;//保存宽高
byte pBit = new byte[bibmWidthBytesbibmHeight];
::GetBitmapBits(hBmp,bibmWidthBytesbibmHeight,pBit);//获取位图数据
int n = ybibmWidthBytes + xbibmBitsPixel/8;
int out = RGB(pBit[n+2],pBit[n+1],pBit[n]);//定位到数据中获取颜色信息
GdiplusShutdown(gdiplusToken);//关闭GDI+
}
这里是用GDI+加载位图,也可以用第三方库加载位图获取位图数据然后直接定位像素,使用的时候记得加GDI+的头文件,否则编译不过
以上就是关于关于API函数的三个问题想请教。全部的内容,包括:关于API函数的三个问题想请教。、VC++图像处理中对BItmap文件结构的读取、如何获得图像的bitmapdescriptor等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)