Android:如何做这个框架油漆?

Shr*_*jan 7 android draw flood-fill android-canvas

我有一些静态图像如下:

在此输入图像描述

现在,我想要的是,当我触摸脸部或手部时,所选择的颜色应该填充在该皮肤部分上.

见下面的结果图:

在此输入图像描述

那么如何获得上面的结果?重做和撤消功能也应该存在.

我尝试使用FloodFill颜色,但这样做我只能对特定部分进行着色.因为FloodFill只填充颜色,直到相同的pixwl颜色出现.如果触摸位置像素颜色发生变化,它将不会填充颜色.

所以Usinf FloodFill我得到了如下图像的结果,如果我按下手,那么只有手部分将填充颜色,而不是它我想要填充另一只手和脸的颜色. 在此输入图像描述

所以请在这种情况下帮助我.

EDITED

一些答复后,我得到了像解决这一个.

但仍然存在内存问题.它消耗大量内存来绘制颜色.所以,任何人都可以帮助我吗?

Mat*_*ian 14

您可以使用实际方式对完整图像进行着色,当您使用颜色填充某个区域时,它将替换要填充的颜色指定的所有区域.

Layman的条款:

  1. 用户将点击OUTLINE的手
  2. 将使用具有完美颜色编码区域的另一图像检查该点击位置.对于这种情况,我们称之为MASK.所有皮肤区域都具有相同的颜色.衬衫区域将是另一种颜色.
  3. 无论用户点击何处,用户选择的颜色都将应用于MASK中具有相似颜色的每个像素,但不是直接在MASK上绘制,而是绘制到OUTLINE的像素上.

我希望这有帮助.

如果你想要一个例子,请随意发表评论然后我可以用它更新答案,但我想你可以从这里得到它.

编辑:

基本上从这样一个简单的图像开始.我们可以称之为大纲

简单的形象

然后作为开发人员,你必须做一些工作.在这里,您可以对OUTLINE进行颜色编码.结果我们称之为MASK.为此,我们使用您想要的相同颜色对区域进行颜色编码.这可以在油漆或其他任何事情上完成.我使用Photoshop很酷lol:D.

面具

然后是ALGORITHM让它在手机上工作.在阅读代码之前,请查看此变量.

int ANTILAISING_TOLERANCE = 70; //Larger better coloring, reduced sensing
Run Code Online (Sandbox Code Playgroud)

如果放大图像特别注意边框的黑色区域,您实际上可以看到,有时,计算机会混合颜色.为了解释该变化,我们使用此容差值.

COLORINGANDROIDACTIVITY.JAVA

package mk.coloring;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.view.View.OnTouchListener;

public class ColoringAndroidActivity extends Activity implements OnTouchListener{
    /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    findViewById(R.id.imageView1).setOnTouchListener(this);
}

int ANTILAISING_TOLERANCE = 70;
public boolean onTouch(View arg0, MotionEvent arg1) {
    Bitmap mask = BitmapFactory.decodeResource(getResources(), R.drawable.mask);
    int selectedColor = mask.getPixel((int)arg1.getX(),(int)arg1.getY());           
    int sG = (selectedColor & 0x0000FF00) >> 8;
    int sR = (selectedColor & 0x00FF0000) >> 16;
    int sB = (selectedColor & 0x000000FF);

    Bitmap original = BitmapFactory.decodeResource(getResources(), R.drawable.empty);       
    Bitmap colored = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Config.ARGB_8888);
    Canvas cv = new Canvas(colored);
    cv.drawBitmap(original, 0,0, null);

    for(int x = 0; x<mask.getWidth();x++){
        for(int y = 0; y<mask.getHeight();y++){
            int g = (mask.getPixel(x,y) & 0x0000FF00) >> 8;
            int r = (mask.getPixel(x,y) & 0x00FF0000) >> 16;
            int b = (mask.getPixel(x,y) & 0x000000FF);
            if(Math.abs(sR - r) < ANTILAISING_TOLERANCE && Math.abs(sG - g) < ANTILAISING_TOLERANCE && Math.abs(sB - b) < ANTILAISING_TOLERANCE)
                colored.setPixel(x, y, (colored.getPixel(x, y) & 0xFF000000) | 0x00458414);
        }
    }
    ((ImageView)findViewById(R.id.imageView1)).setImageBitmap(colored);

    return true;
}
Run Code Online (Sandbox Code Playgroud)

}

此代码不向用户提供大量颜色选择.相反,如果用户触摸某个区域,它将查看MASK并相应地绘制OUTLINE.但是,你可以真正有趣和互动.

结果

当我碰到那个男人的头发时,它不仅给头发上色,而且用同样的颜色涂上他的衬衫和手.将它与MASK进行比较,以便了解发生的情况.

结果

这只是一个基本想法.我创建了多个位图,但实际上并不需要它.我曾将它用于测试目的并占用不必要的内存.而且您不需要在每次点击时重新创建蒙版等.

我希望这会对你有所帮助:D

祝好运