用VC实现羽化特效 用VC实现羽化特效,哪位牛人能给我说说嘛 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 VC实现羽化特效float mSize = 0.5f; public Bitmap render(Bitmap bitmap) { if(bitmap == null)return null; final int SIZE = 32768; int width = bitmap.getWidth(); int height = bitmap.getHeight(); int ratio = width >height ? height * SIZE /width : width * SIZE/height;//这里有额外*2^15 用于放大比率;之后的比率使用时需要右移15位,或者/2^15. int cx = width>>1; int cy = height>>1; int max = cx*cx + cy*cy; int min = (int)(max *(1-mSize)); int diff= max -min;// ===>> int diff = (int)(max * mSize); int[] pixels = new int[width * height]; bitmap.getPixels(pixels ,0 , width , 0 , 0 , width , height); for(int i=0 ; i<height ; i++) { for(int j=0 ; j<width ; j++) { int pixel = pixels[i*width +j]; int r = (pixel & 0x00ff0000)>>16; int g = (pixel & 0x0000ff00)>>8; int b = (pixel & 0x000000ff); int dx = cx - j; int dy = cy - i; if(width > height) { dx= (dx*ratio)>>15; } else { dy = (dy * ratio)>>15; } int dstSq = dx*dx + dy*dy; float v = ((float) dstSq / diff)*255; r = (int)(r +v); g = (int)(g +v); b = (int)(b +v); r = (r>255 ? 255 : (r<0? 0 : r)); g = (g>255 ? 255 : (g<0? 0 : g)); b = (b>255 ? 255 : (b<0? 0 : b)); pixels[i*width +j] = (pixel & 0xff000000) + (r<<16)+ (g<<8) +b; } } return Bitmap.createBitmap(pixels ,width , height , Config.ARGB_8888); }羽化值越大,朦胧范围越宽,羽化值越小,朦胧范围越窄。可根据你想留下图的大小来调节。算法分析:1、通过对rgb值增加额外的V值实现朦胧效果2、通过控制V值的大小实现范围控制。3、V = 255 * 当前点Point距中点距离的平方s1 / (顶点距中点的距离平方 *mSize)s2;4、s1 有根据 ratio 修正 dx dy值。 bitmap.getPixels(pixels ,0 , width , 0 , 0 , width , height);这个函数Bitmap是没有的,应该是用户自定义的,我来试试看 int[] pixels 这句在C++里是不可能存在的,肯定是别的代码,而且你new 了吧,只有c# java是可以只new 而不必delete的 用高斯算法,我在您的另一个帖子里已经回复了,我有图形库(gingkoVG)可以实现:各种Filter,包含高斯和锐化等。(http://bbs.csdn.net/topics/390369037?page=1#post-393701434) 关于C/C++运行时库与windows系统库之间的关系 应用程序之间的调用问题 怎么用VC实现去掉数据包头并正确解析出来?求源代码 为什么我的VC++6.0没有Info View? 有谁卖CD/DVD刻录的SDK吗? 多线程+socket+ODBC API连接mysql,句柄降不下来 如何在当前对话框中使用其他对话框中的资源? Modem之间的通讯问题!急!真急!都要急死了!500分源码! 高手来看!!50分!! 一个字符的问题 vc绘图画不出 用VC实现羽化特效
public Bitmap render(Bitmap bitmap)
{
if(bitmap == null)return null; final int SIZE = 32768;
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int ratio = width >height ? height * SIZE /width : width * SIZE/height;//这里有额外*2^15 用于放大比率;之后的比率使用时需要右移15位,或者/2^15. int cx = width>>1;
int cy = height>>1;
int max = cx*cx + cy*cy;
int min = (int)(max *(1-mSize));
int diff= max -min;// ===>> int diff = (int)(max * mSize);
int[] pixels = new int[width * height];
bitmap.getPixels(pixels ,0 , width , 0 , 0 , width , height);
for(int i=0 ; i<height ; i++)
{
for(int j=0 ; j<width ; j++)
{
int pixel = pixels[i*width +j];
int r = (pixel & 0x00ff0000)>>16;
int g = (pixel & 0x0000ff00)>>8;
int b = (pixel & 0x000000ff); int dx = cx - j;
int dy = cy - i; if(width > height)
{
dx= (dx*ratio)>>15;
}
else
{
dy = (dy * ratio)>>15;
} int dstSq = dx*dx + dy*dy;
float v = ((float) dstSq / diff)*255;
r = (int)(r +v);
g = (int)(g +v);
b = (int)(b +v);
r = (r>255 ? 255 : (r<0? 0 : r));
g = (g>255 ? 255 : (g<0? 0 : g));
b = (b>255 ? 255 : (b<0? 0 : b));
pixels[i*width +j] = (pixel & 0xff000000) + (r<<16)+ (g<<8) +b;
}
} return Bitmap.createBitmap(pixels ,width , height , Config.ARGB_8888);
}羽化值越大,朦胧范围越宽,羽化值越小,朦胧范围越窄。可根据你想留下图的大小来调节。
算法分析:
1、通过对rgb值增加额外的V值实现朦胧效果
2、通过控制V值的大小实现范围控制。
3、V = 255 * 当前点Point距中点距离的平方s1 / (顶点距中点的距离平方 *mSize)s2;
4、s1 有根据 ratio 修正 dx dy值。
这个函数Bitmap是没有的,应该是用户自定义的,我来试试看
(http://bbs.csdn.net/topics/390369037?page=1#post-393701434)