- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一些像下面这样的静态图片:
现在,我想要的是,当我触摸脸部或手部时,所选颜色应该填充到该皮肤部分。
结果见下图:
那么如何得到上面的结果呢??重做和撤消功能也应该在那里。
我已经尝试使用 FloodFill 颜色,但这样做我只能对特定部分进行颜色处理。因为 FloodFill 只填充颜色,直到出现相同的 pixwl 颜色。如果触摸位置像素颜色发生变化,它将不会在其上填充颜色。
所以 Usinf FloodFill 我得到了如下图所示的结果,如果我按下手,那么只有手的部分会填充颜色,而不是我想给另一只手和脸填充颜色。
所以请在这种情况下帮助我。
已编辑
经过一些回复,我得到了类似 this one 的解决方案.
但仍然存在内存问题。绘制颜色会消耗大量内存。那么,有人可以帮助我吗?
最佳答案
您可以让一个完整的图像以实际方式着色,当您用一种颜色填充某个区域时,它将替换所有由该颜色指定的要填充的区域。
外行术语:
希望对您有所帮助。
如果你想要一个例子,请随时发表评论,然后我可以用它更新答案,但我认为你可以从这里得到它。
编辑:
基本上从像这样的简单图像开始。我们可以将其称为OUTLINE
然后作为开发者,你必须做一些工作。在这里,您对 OUTLINE 进行颜色编码。我们称之为 MASK 的结果。为此,我们用您想要的相同颜色对区域进行颜色编码。这可以在油漆或其他任何东西上完成。我用 Photoshop 很酷哈哈 :D。
然后是让它在手机上运行的算法。在阅读代码之前,请查看此变量。
int ANTILAISING_TOLERANCE = 70; //Larger better coloring, reduced sensing
如果放大图像,特别注意边框的黑色区域,您实际上可以看到,有时计算机会稍微混合颜色。为了说明这种变化,我们使用这个容差值。
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;
}
这段代码没有为用户提供很多颜色选择。相反,如果用户触摸某个区域,它将查看 MASK 并相应地绘制 OUTLINE。但是,您可以制作出非常有趣和互动的内容。
结果
当我抚摸那个男人的头发时,不仅头发染上了颜色,而且他的衬衫和手也染上了同样的颜色。将其与MASK 进行比较,以更好地了解发生了什么。
这只是一个基本的想法。我已经创建了多个位图,但实际上并不需要这样做。我曾将它用于测试目的并占用了不必要的内存。而且您不需要在每次点击时重新创建蒙版等。
希望对你有帮助:D
祝你好运
关于Android:如何做这个框架涂料?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9748206/
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!