浮雕图像形状的边缘显示android中的深度

浮雕图像形状的边缘显示android中的深度,第1张

概述我想显示3D浮雕外观和感觉,如下图所示.我使用EmbossMaskFilter但无法让它显示效果(请参阅下面的代码).有没有不同的方法来做到这一点?或者我如何使用EmbossMaskFilter. 要求的输出 我的输出 Path path2 = new Path();public Paint fillPaint = null;// called in constructorpublic vo 我想显示3D浮雕外观和感觉,如下图所示.我使用embossMaskFilter但无法让它显示效果(请参阅下面的代码).有没有不同的方法来做到这一点?或者我如何使用embossMaskFilter.

要求的输出

我的输出

Path path2 = new Path();public Paint fillPaint = null;// called in constructorpublic voID createPath(){    //path 2 Big one    araay = new Point[]{new Point(144,320),new Point(109,200),new Point(171,308),new Point(178,240),172),282),new Point(144,160)};    AddBezIErs(path2,araay,320,144);    Addline(path2,216,144 );    Addline(path2,216 );    Addline(path2,144,320);     MaskFilter memboss = new embossMaskFilter(new float[] { 1,1,1 },0.4f,6,3.5f);    fillPaint = new Paint(Paint.ANTI_AliAS_FLAG);    fillPaint.setcolor(color.WHITE);    fillPaint.setFlags(Paint.ANTI_AliAS_FLAG | Paint.DITHER_FLAG);    fillPaint.setAntiAlias(true);    fillPaint.setDither(true);    fillPaint.setstrokeJoin(Paint.Join.ROUND);    fillPaint.setstrokeCap(Paint.Cap.ROUND);    fillPaint.setStyle(Paint.Style.FILL);    paint.setMaskFilter(memboss);   } // add lines to the pathprotected Path Addline(Path path,int endX,int endY) {    //path.moveto(startX,startY);    path.lineto(endX,endY);    return path;}// add curves to the pathprotected Path AddBezIErs(Path path,Point[] points,int lastX,int lastY) {    if (points[0].X != lastX && points[0].Y != lastY)        path.moveto(points[0].X,points[0].Y);    int index = 1;    path.cubicTo(points[index].X,points[index].Y,points[index + 1].X,points[index + 1].Y,points[index + 2].X,points[index + 2].Y);    index = index + 3;    path.cubicTo(points[index].X,points[index + 2].Y);    return path;}//draw on canvas@OverrIDepublic voID onDraw(Canvas canvas) {    canvas.drawPath(path2,fillPaint);    super.onDraw(canvas);}
解决方法 如果您只想进行位图处理(而不是3D或矢量),最好的选择可能是:

>从你的拼图中生成一个模板面具,
>使用Difference of Gaussians来处理它(在本例中我使用了大小为12和2像素的内核),然后标准化并反转结果,
>使用掩模(1.)作为模板通道,将“2”的输出混合到原始图像中.

更新:这里是代码.我试图重用你的变量名,以便更容易理解.代码尽可能使用Renderscript内在函数,以使事情更快,更有趣.

private Paint fillPaint = null;private Path path2;private Bitmap mBitmAPIn;private Bitmap mBitmapPuzzle;private RenderScript mRS;private Allocation mInAllocation;private Allocation mpuzzleAllocation;private Allocation mCutterallocation;private Allocation mOutAllocation;private Allocation mOutAllocation2;private Allocation mAllocationHist;private ScriptIntrinsicBlur mScriptBlur;private ScriptIntrinsicBlend mScriptBlend;private ScriptIntrinsicHistogram mScriptHistogram;private ScriptIntrinsicLUT mScriptLUT;private Context ctx;private int bw = 780;private int bh = 780;private voID init(){    mBitmAPIn = loadBitmap(R.drawable.cat7); // background image    mBitmapPuzzle = Bitmap.createBitmap(bw,bh,Bitmap.Config.ARGB_8888);  // this will hold the puzzle    Canvas c = new Canvas(mBitmapPuzzle);    path2 = new Path();    createPath(5);  // create the path with stroke wIDth of 5 pixels    c.drawPath(path2,fillPaint);  // draw it on canvas    createScript();  // get renderscripts and Allocations ready    // Apply gaussian blur of radius 25 to our drawing    mScriptBlur.seTradius(25);    mScriptBlur.setinput(mpuzzleAllocation);    mScriptBlur.forEach(mOutAllocation);    // Now apply the blur of radius 1    mScriptBlur.seTradius(1);    mScriptBlur.setinput(mpuzzleAllocation);    mScriptBlur.forEach(mOutAllocation2);    // Subtract one blur result from another    mScriptBlend.forEachSubtract(mOutAllocation,mOutAllocation2);    // We Now want to normalize the result (e.g. make it use full 0-255 range).    // To do that,we will first compute the histogram of our image    mScriptHistogram.setoutput(mAllocationHist);    mScriptHistogram.forEach(mOutAllocation2);    // copy the histogram to Java array...    int []hist = new int[256 * 4];    mAllocationHist.copyTo(hist);    // ...and walk it from the end looking for the first non empty bin    int i;    for(i = 255; i > 1; i--)        if((hist[i * 4] | hist[i * 4 + 1] | hist[i * 4 + 2]) != 0)            break;    // Now setup the LUTs that will map the image to the new,wIDer range.    // We also use the opportunity to inverse the image ("255 -").    for(int x = 0; x <= i; x++)    {        int val = 255 - x * 255 / i;        mScriptLUT.setAlpha(x,255);  // note we always make it fully opaque        mScriptLUT.setRed(x,val);        mScriptLUT.setGreen(x,val);        mScriptLUT.setBlue(x,val);    }    // the mapPing itself.    mScriptLUT.forEach(mOutAllocation2,mOutAllocation);

让我们休息一下,看看到目前为止我们有什么.观察到左边的整个图像是不透明的(即包括拼图外面的空间),我们现在必须正确地剪切其边缘形状和抗锯齿.不幸的是,使用原始形状不起作用,因为它太大而且切得太多,导致边缘附近出现令人不快的伪影(右图).


因此,我们绘制了另一条路径,这次是使用更窄的行程……

Bitmap mBitmapCutter = Bitmap.createBitmap(bw,Bitmap.Config.ARGB_8888);    c = new Canvas(mBitmapCutter);    path2 = new Path();    createPath(1);  // stroke wIDth 1    c.drawPath(path2,fillPaint);    mCutterallocation = Allocation.createFromBitmap(mRS,mBitmapCutter);    // cookie cutter Now    mScriptBlend.forEachDstIn(mCutterallocation,mOutAllocation);

…为了更好看的结果.我们用它来掩盖背景图像.

mScriptBlend.forEachMultiply(mOutAllocation,mInAllocation);    mInAllocation.copyTo(mBitmapPuzzle);}

你好!现在只是Renderscript设置代码.

private voID createScript() {    mRS = RenderScript.create(ctx);    mpuzzleAllocation = Allocation.createFromBitmap(mRS,mBitmapPuzzle);    // three following allocations Could actually use createSized(),// but the code would be longer.    mInAllocation = Allocation.createFromBitmap(mRS,mBitmAPIn);    mOutAllocation = Allocation.createFromBitmap(mRS,mBitmapPuzzle);    mOutAllocation2 = Allocation.createFromBitmap(mRS,mBitmapPuzzle);    mAllocationHist = Allocation.createSized(mRS,Element.I32_3(mRS),256);    mScriptBlur = ScriptIntrinsicBlur.create(mRS,Element.U8_4(mRS));    mScriptBlend = ScriptIntrinsicBlend.create(mRS,Element.U8_4(mRS));    mScriptHistogram = ScriptIntrinsicHistogram.create(mRS,Element.U8_4(mRS));    mScriptLUT = ScriptIntrinsicLUT.create(mRS,Element.U8_4(mRS));}

最后onDraw():

@OverrIDeprotected voID onDraw(Canvas canvas) {    canvas.drawBitmap(mBitmapPuzzle,fillPaint);    super.onDraw(canvas);}

Todo:检查其他中风杆是否会给出更舒适的角落.

总结

以上是内存溢出为你收集整理的浮雕图像形状的边缘显示android中的深度全部内容,希望文章能够帮你解决浮雕图像形状的边缘显示android中的深度所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1138988.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存