9-slice bitmap class

flash里的9切格是只能对于flash里的元素来说的,对于从外面导入的图片(比如PNG,JPG),是不支持的,

但是这个可以,  其实原理还是它把图片转成了bitmap,然后再9切格的.

详情

 

 

阅读更多

一个自定义 Bitmap Class 的问题

01-11

自己想写一个bitmap类,无继承关系的c++类,暂时就想读取bmp文件,建立出位图句柄,以供windows下GDI使用(win32程序),但是写了一个类,却得不出意想的结果。rn网上的资料也看了很多,不过很多部分都是MFC继承的类,无法做技术细节的参考,故在此发贴,希望寻求帮助。rnrn现在我模糊的几个地方:rn1.位图图象数据处。看资料说位图的每一行象素的个数都应该是4的倍数,这一点在读取位图的时候需要使用吗?还是仅在将一个内存中的位图写入磁盘的时候才需要使用?rn2.位图调色板。现已知道8位以上的位图无调色板。对于8位及8位以下的位图应该如何建立位图调色板。网上资料中提到的逻辑调色板及系统调色板又是怎么一回事呀?rn对于8位以上的位图,它的文件结构中BITMAPINFO的RGBQUAD数组是否存在,如果存在又是怎么样的呢?rn3.CreateDIBitmap的问题。这个基本上是第二个问题所引发出来的问题。网上资料说在使用这个函数之前应该现用SelectPalette将调色板装入DC中,然后再建立位图,之后再将系统原来调色板选入DC。但是对于8位以上的没有调色板的位图又应该如何呢?rnrn暂时想到的就这些问题,希望我说明白了自己的问题。下面我将今天写的Bitmap类贴出来,希望大家帮忙看看,哪些地方错了。rnrn========Bitmap.h=========================================================rn#pragma oncernrnclass Bitmaprnrnpublic:rn HBITMAP m_hBitmap; //位图句柄rn LPBITMAPINFOHEADER m_bmih; //位图信息头指针rn LPBITMAPINFO m_bmi; //位图信息指针rn WORD m_width; //宽度rn WORD m_height; //高度rn DWORD m_dwDibSize; //Dib数据大小rn LPRGBQUAD m_pRgbQuad; //调色板信息的指针rn LPBYTE m_pDibBits; //图象数据指针rn LPBYTE m_pDib; //Dib数据指针rn HPALETTE m_hPalette; //调色板句柄rnprivate:rn int m_nPaletteEntries; //调色板颜色数rnpublic:rn Bitmap(void);rn ~Bitmap(void);rnrnpublic:rn HBITMAP LoadFromFile(HDC hDC, LPTSTR szFileName);rn void DrawBitmap(HDC hDC, HBITMAP hBitmap);rnprivate:rn int GetColorNum(LPBITMAPINFOHEADER lp_bmih);rn HPALETTE CreateDibPalette(void);rn;rnrn==========Bitmap.cpp====================================================rn#include "stdafx.h"rn#include "Bitmap.h"rn#include rn#include rnusing namespace std;rnrnBitmap::Bitmap(void)rnrnrnrnBitmap::~Bitmap(void)rnrn delete []m_pDib;rnrnrnHBITMAP Bitmap::LoadFromFile(HDC hDC, LPTSTR szFileName) rnrn HBITMAP _hBmp;rn BITMAPFILEHEADER _bmfh;rnrn ifstream bmp;rn bmp.open(szFileName, ios_base::binary | ios_base::in);rnrn bmp.read((char *)&_bmfh,sizeof(BITMAPFILEHEADER));rn if(_bmfh.bfType != 0x4d42)rn rn bmp.close();rn return NULL;rn rn rn m_dwDibSize = _bmfh.bfSize - sizeof(BITMAPFILEHEADER);rn m_pDib = (LPBYTE)new BYTE[m_dwDibSize];rn bmp.read((char *)m_pDib,m_dwDibSize);rnrn m_bmi = (LPBITMAPINFO)m_pDib;rn m_bmih = (LPBITMAPINFOHEADER)m_pDib;rn m_pRgbQuad = (LPRGBQUAD)(m_pDib+sizeof(BITMAPINFOHEADER));rn int ColorNum = GetColorNum(m_bmih);rn m_pDibBits = m_pDib + ColorNum*sizeof(RGBQUAD) + sizeof(BITMAPINFOHEADER);rn m_width = LOWORD(m_bmih->biWidth);rn m_height = LOWORD(m_bmih->biHeight);rnrn HPALETTE holdPalette;rn m_hPalette = CreateDibPalette();rn holdPalette = SelectPalette(hDC, m_hPalette, TRUE);rn// RealizePalette(hDC);rn _hBmp = CreateDIBitmap(hDC, m_bmih, CBM_INIT, (LPVOID)m_pDibBits, m_bmi, DIB_RGB_COLORS); rn SelectPalette(hDC, m_hPalette, TRUE);rn bmp.close();rnrn return _hBmp;rnrnrnint Bitmap::GetColorNum(LPBITMAPINFOHEADER lp_bmih) rnrn if(m_bmih->biBitCount > 8)rn return 0;rn return m_bmih->biClrUsed;rnrnrnHPALETTE Bitmap::CreateDibPalette() rnrn LPLOGPALETTE s_lpPal;rn HPALETTE s_hPal = NULL;rn int wColorNum = GetColorNum(m_bmih);rnrn s_lpPal = (LPLOGPALETTE) new BYTE[wColorNum*sizeof(PALETTEENTRY) + 2*sizeof(WORD)];rn s_lpPal->palVersion = 1;rn s_lpPal->palNumEntries = wColorNum;rnrn for(int i=0; ipalPalEntry[i].peBlue = m_bmi->bmiColors[i].rgbBlue;rn s_lpPal->palPalEntry[i].peGreen = m_bmi->bmiColors[i].rgbGreen ;rn s_lpPal->palPalEntry[i].peRed = m_bmi->bmiColors[i].rgbRed ;rn s_lpPal->palPalEntry[i].peFlags = m_bmi->bmiColors[i].rgbReserved = (BYTE)0;rn rnrn s_hPal = CreatePalette(s_lpPal);rnrn return s_hPal;rnrnrnvoid Bitmap::DrawBitmap(HDC hDC, HBITMAP hBitmap) rnrn HDC MemDC = CreateCompatibleDC(hDC);rn SelectObject(MemDC, hBitmap);rn BitBlt(hDC, 0,0, m_width, m_height, MemDC, m_width, m_height, SRCCOPY);rn DeleteObject(MemDC);rn

没有更多推荐了,返回首页