png图像中的黑色分为依据透明度不同,在有些软件里的显示时不同的,比如透明度为0的黑色(RGB为0),在Windows的图片查看器中显示的白色,而在画图软件中则显示的黑色。但透明度为255的黑色在在Windows图片查看器中显示为黑色。
在Andriod中用到的.9.png图像的四周黑色拉伸条只是简单的将其ARGB设置为oxff000000,即透明度为255的纯黑色,一圈像素的其它区域则是ox00000000,即透明度为0的纯黑色,所以在读取拉伸条的时候要考虑到透明度。
CImage* m_pngTemp;
int iw = m_pngTemp->GetWidth();
//m_HorizPointList 为水平链表,记录各个拉伸条的起始点坐标
int width = m_pngTemp->GetWidth();
int heigh = m_pngTemp->GetHeight();
POSITION posH = m_HorizPointList.GetHeadPosition();
for(int i = 1; i < width-1; i++)//图片第一行像素
{
int* pucColor_pre = reinterpret_cast<int *>(m_pngTemp->GetPixelAddress(i-1,0));
int* pucColor_curr = reinterpret_cast<int *>(m_pngTemp->GetPixelAddress(i,0));
int* pucColor_next = reinterpret_cast<int *>(m_pngTemp->GetPixelAddress(i+1,0));
//选择条的黑色对应的透明度为255,其他也为黑色,但透明度为0
//当前的黑线条只有一个像素
if (*pucColor_curr == 0xff000000 && *pucColor_pre != 0xff000000 && *pucColor_next != 0xff000000)
{
m_HorizPointList.InsertAfter(posH,CPoint(i,1));
m_HorizPointList.GetNext(posH);
m_HorizPointList.InsertAfter(posH,CPoint(i+1,1));
m_HorizPointList.GetNext(posH);
}
//当前的黑线条有多个像素,黑线条的前一个点
else if (*pucColor_curr == 0xff000000 && *pucColor_pre != 0xff000000)
{
m_HorizPointList.InsertAfter(posH,CPoint(i,1 ));
m_HorizPointList.GetNext(posH);
}
//黑线条的后一个点
else if (*pucColor_curr == 0xff000000 && *pucColor_next != 0xff000000)
{
m_HorizPointList.InsertAfter(posH,CPoint(i+1,1 ));
m_HorizPointList.GetNext(posH);
}
}