質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

Q&A

解決済

1回答

3951閲覧

画像をタップして色コードを取得し、近い色を探して色名を得るプログラム

schoolstudent

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

0グッド

0クリップ

投稿2021/07/28 13:08

編集2021/07/31 12:00

現在、AndroidAStudioにて、端末ファイルから出力した画像を表示し、その画像の中で知りたい色の部分をタップすると色コード、または色名を表示するプログラムを作成しています。
ですが、タップしたときの色コードの取得がどうしてもわかりません。画像が固定の場合の色コードの取得は調べるといくらでもでてくるのですが、ファイルから選んで出力した場合のパターンがでてきません、、。
どうか、public boolean onTouchEvent(MotionEvent event) { 内の動作を教えていただけないでしょうか、、、。
また、座標を求めることはできたのですが、やりたいことは同じなので画像とか関係なく座標の数値だけで色コードを取得することはできませんか?(取得範囲を画面全体にするということ)
どうかご教授お願いします。
(下記プログラムは端末内の画像を選択し出力、そして、タップした座標を求めるプログラムです。)
◎追加記
タップした場所のカラーコードを取得するプログラムにしました。
カラーコードから色名を取得、出力する方法をご教授お願いします。

java

1 2import androidx.appcompat.app.AppCompatActivity; 3import androidx.core.content.ContextCompat; 4 5 6import android.annotation.SuppressLint; 7import android.content.Intent; 8import android.graphics.Bitmap; 9import android.graphics.BitmapFactory; 10import android.graphics.Matrix; 11import android.graphics.drawable.BitmapDrawable; 12import android.net.Uri; 13import android.os.Bundle; 14 15import android.os.ParcelFileDescriptor; 16import android.os.Parcelable; 17import android.view.MotionEvent; 18import android.view.View; 19import android.widget.ImageView; 20import android.widget.TextView; 21 22import java.io.FileDescriptor; 23import java.io.IOException; 24 25 26public class MainActivity extends AppCompatActivity { 27 private static final int RESULT_PICK_IMAGEFILE = 1000; 28 private ImageView imageView; 29 private Bitmap bmp; 30 private TextView colorRGB; 31 32 33 @Override 34 protected void onCreate(Bundle savedInstanceState) { 35 super.onCreate(savedInstanceState); 36 setContentView(R.layout.activity_main); 37 imageView = (ImageView) findViewById(R.id.image_view); 38 39 colorRGB = (TextView)findViewById(R.id.colorrgb); 40 41 42 findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { 43 @Override 44 public void onClick(View v) { 45 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 46 intent.addCategory(Intent.CATEGORY_OPENABLE); 47 intent.setType("image/*"); 48 startActivityForResult(intent, RESULT_PICK_IMAGEFILE); 49 } 50 }); 51 52 } 53 54 55 @Override 56 public void onActivityResult(int requestCode, int resultCode, Intent resultData) { 57 super.onActivityResult(requestCode, resultCode, resultData); 58 if (requestCode == RESULT_PICK_IMAGEFILE && resultCode == RESULT_OK) { 59 Uri uri = null; 60 if (resultData != null) { 61 uri = resultData.getData(); 62 63 try { 64 bmp = getBitmapFromUri(uri); 65 imageView.setImageBitmap(bmp); 66 } catch (IOException e) { 67 e.printStackTrace(); 68 } 69 } 70 } 71 } 72 73 74 private Bitmap getBitmapFromUri(Uri uri) throws IOException { 75 ParcelFileDescriptor parcelFileDescriptor = 76 getContentResolver().openFileDescriptor(uri, "r"); 77 FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); 78 Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor); 79 parcelFileDescriptor.close(); 80 return image; 81 82 } 83 84 @SuppressLint("SetTextI18n") 85 @Override 86 public boolean onTouchEvent(MotionEvent event) { 87 switch (event.getAction()) { 88 case MotionEvent.ACTION_DOWN: 89 int x = (int) event.getRawX(); //タッチしたX座標 90 int y = (int) event.getRawY(); //タッチしたY座標 91 92 int touchedRGB = bmp.getPixel(x, y); 93 94 colorRGB.setText("touched color: " + "#" + Integer.toHexString(touchedRGB)); 95 colorRGB.setTextColor(touchedRGB); 96 break; 97 } 98 99 return true; 100 101 } 102}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/07/28 14:28

「android bitmap 座標 色」と言った文言で探すとソレっぽいものがあるように思いますが、それらではダメだったのでしょうか。
hoshi-takanori

2021/07/28 21:34

まず、画像そのものもフィールドに保存した方がいいと思います。 あと、タップした座標を求めることがそもそもできてないように見えますが…。
schoolstudent

2021/07/28 22:29 編集

jimbeさん、今回も対応していただきありがとうございます。 int Bitmap.getPixel(int x, int y) のようなコードでカラーを取得できるのはわかったのですが、Bitmapの部分が赤文字となってしまい、うまくBitmapが扱えていないようです、、、。 コード内に Bitmap bmp = getBitmapFromUri(uri); というコードがありますが、これで使えるようになったわけではないのですか?
schoolstudent

2021/07/28 22:31

hoshi-takanoriさん対応ありがとうございます。座標を求めるプログラムは必要かわからなかったので消去していました、。編集しておきます。 画像のフィールド保存とはどういうことでしょうか?Androidアプリの開発が初めてでして無知でごめんなさい。
hoshi-takanori

2021/07/28 23:04

Android というか Java に不慣れなようですが、Java ではクラスとインスタンスを区別する必要があります。 https://qiita.com/komo_ta/items/a5b4b5ea43cb8db2db2a Bitmap bmp = getBitmapFromUri(uri); というのは、Bitmap というクラス型の変数 bmp に、getBitmapFromUri の結果得られた Bitmap のインスタンス (オブジェクトとも言う) を格納します。 でもって、getPixel は Bitmap のインスタンスに対して呼ぶ必要があるので、bmp.getPixel(x, y) という形で使います。 また、この bmp という変数は onActivityResult メソッドのローカル変数になっているので、他のメソッドでは使えません。タップされた場所の色の取得は onTouchEvent で行う必要があるので、bmp を onTouchEvent でも使えるようにするためには、フィールド (インスタンス変数とかプロパティとか言う場合もある) に格納しておく必要があります。 https://qiita.com/Lovely_030_Dong/items/8a5bebd7f90a0b5d168d それから、onTouchEvent ではイベントの種類 (event.getAction() で取得できます) によって場合分けした方がいいと思います。とりあえず ACTION_DOWN だけ (または ACTION_MOVE も?) で良いのでは…。 https://techbooster.org/android/application/715/
jimbe

2021/07/29 02:57 編集

> 今回も対応していただき いえ、対応というほどのことではありません。 自分に分かりそうかなと思ったご質問で欲しい情報があればこの欄に書かせて頂くだけです^^; > int Bitmap.getPixel(int x, int y) のようなコードで・・・ ご質問本体にこのような所まで書いて頂いて、コード上でもその行があったりしますと、もっと「この場合はこうなるのでは・・・」という感じで回答が付き易いかと思います。 いろいろ書いてみて赤くなったりエラーが出たりで結局消すしかなかったというのはとてもよく分かります。結果「〇〇するにはどうしたらよいでしょう」となっているご質問もよくあります。 ですが、質問が具体的であればあるほど回答も具体的に出来ます。それだけ作る人によって(時には個人の美学によって)プログラムの"形"は多様です。俳句は、少ない文字数にも関わらず、複数の人が同じ状況の中で作っても同じものが出来ることは少なそうですよね。そんな感じかと思います。 ついでですが、件名に「android java」などは入れなくても大丈夫です。何に関することかはタグで分かります。
jimbe

2021/07/29 03:27

> Bitmap bmp = getBitmapFromUri(uri); というコードがありますが 正確な所は hoshi-takanori さんにお答えいただいていますので具体的に。 言ってしまえば、この Bitmap bmp を private ImageView imageView; の位置に移動させます。つまり private ImageView imageView; private Bitmap bmp; //これを追加 とし、これが「bmp をフィールドにした」ことになります。 そして、元の行は bmp = getBitmapFromUri(uri); とし、つまり先頭にあった (bmp の型を示す) "Bitmap" というのを消します。これで getBitmapFromUrl の結果を bmp フィールドに入れるようになります。
schoolstudent

2021/07/29 16:06 編集

hoshi-takanoriさん、URLを添えて丁寧な解説ありがとうございます。ローカル関数、クラスとインスタンスについて理解することができました。とても助かります!!bmpという変数を宣言することにより、無事カラーコードを取得することができました!!本当にありがとうございます。  追加質問で申し訳ないのですが、このカラーコードを色名として出力するにはどうすればよいのでしょうか、、。カラーコードをif文で分ければよいと安易に考えていたのですが、カラーコードは16進数の大きさで分けられているわけではないとわかったので、、。調べてみるとcolorクラスのスタティックメゾットなどがでてきたのですが自分がやりたいことと一致しているのかよくわかりませんでした。お時間あれば教えていただけると嬉しいです。
schoolstudent

2021/07/29 16:16

jimbeさん自分のプログラムを具体的に指示しながら教えてくださりありがとうございます。とてもわかりやすく、理解度が高まりました!!無事、カラーコードを取得するプログラムを作成することができました! ここまでアプリを作成できたことが嬉しいです。サイトの使い方についてもご指摘ありがとうございます。  追加質問で申し訳ないのですが、カラーコードから色名を取得し、出力したいのですがこの動作を行うにはどうすればよいのでしょうか?カラーコードをRGB値変換というのは調べるとヒットするのですが、カラーコードから色名を出力という事例がないため質問させていただきました。もしよろしければ、これについて教えてくださると嬉しいです。
jimbe

2021/07/29 16:31

> カラーコードから色名を出力 色名というと、赤とか青とか紫とか…ということでしょうか。 それはかなり難しいと思います。 getPixel で返る値は、確か ARGB だったかと思います。これは透明度、赤、緑、青の4つのパラメータそれぞれが8ビット 0~255 の値で表されるもので、その場合例えば 赤=100, 緑=50, 青=120, 透明度=50 が「何色か」という判断をすることになります。 あり得る色の数は(透明度を無視しても)256×256×256色、それらすべてに色名があったとしても、恐らく人間が扱うには多すぎるでしょう。
schoolstudent

2021/07/29 23:37 編集

jimbeさん、迅速な対応ありがとうございます!! そうですよね、、1つずつ扱うのは無理ですね、、。色名は1つずつじゃなくてこの色の範囲はこの色名で返すっていう形も厳しいでしょうか?(カラーコードに数値の大きさの一貫性があるわけではないので難しそうですが、。) C#には下記URLのように定義されている色が沢山用意されているみたいなのですが、javaにはないのでしょうか、、。https://csharp-ref.com/drawing_color.html オープンソースは無いですが、自分がやりたいことが実装されている下記URLのようなアプリがあります。これを真似するのは難しいのでしょうか、、。 https://mana-android-dev.com/application/how-to/what-color 多くて申し訳ないのですが、APIとして下記URLのようなものがAndroidstudioに用意されているようです。これをうまく使う方法はないのでしょうか?https://developer.android.com/training/material/palette-colors?hl=ja 丁寧な対応して下さりありがとうございます。お時間あるときに対応して頂けると嬉しいです。
hoshi-takanori

2021/07/30 00:02 編集

> この色の範囲はこの色名 RGB それぞれ 0 〜 255 なので、(0, 0, 0) 〜 (255, 255, 255) という 3 次元の立方体の座標として表せます。で、その範囲は 3 次元で定義する必要があり、簡単ではないです。とりあえずこのページの真ん中らへんの絵が参考になるのでは。 https://kato.chobi.net/colcube/index.html とりあえずこんなん見つけました。(納得いく結果が得られるかは知りませんけど…。) https://gist.github.com/XiaoxiaoLi/8031146
jimbe

2021/07/30 02:28

> C#には下記URLのように定義されている色が沢山用意されているみたい おお、すごいいっぱいありますね。java の Color クラスだと…それこそ赤青黄色ぐらいのレベルじゃないでしょうか。 アプリのほうはどんな処理なのか分かりませんが、APIと言われているのは AndroidStudio のでは無くサポートライブラリとしてアプリで自由に使えるものです。 AndroidStudio で設定すれば使えるのですが…Palette クラスは「背景の画像を元にウィンドウ等の雰囲気を合わせる為に、主要な色を抽出できる」感じのクラスの様で、色の名前は分からなそうです。
schoolstudent

2021/07/30 17:24

hoshi-takanoriさん、RGBの解説に加えて、Githubでオープンソースまで探してくださり、本当にありがとうございます;; takanoriさんが貼ってくださったコードのおかげで自分が作りたかったプログラムを今完成させることができました!!本当にありがとうございました!
jimbe

2021/07/31 02:36

完成おめでとうございます。 ベストアンサーは hoshi-takanori さんに付けて頂きたい所ですが今から回答をお願いするのは大変でしょうか…。 それと schoolstudent さんにお願いがあります。 私の回答はご質問の件名とは離れたものとなってしまいましたので、件名を「画像をタップして色コードを取得し、近い色を探して色名を得る」と言った感じに修正頂けないでしょうか。 現状では画像のある点の色を得る方法を探している人ならこのご質問を見ると思いますが、近い色を得る方法を探している人は見なさそうですので(_ _
schoolstudent

2021/07/31 11:59

確かに、この手の情報は検索してもなかなかヒットするものではなかったですしね、、色んな人が参考になるようにタイトル変更しておきますね!!アドバイスありがとうございます! それに、新しいアルゴリズムも教えて頂き、ありがとうございました!そちらの方も確認してきます! 質問終了後も、丁寧に対応して下さりありがとうございました????
jimbe

2021/07/31 13:08

ありがとうございました。 新しいものと比較できる形に改造したテストアプリプロジェクトを github に上げました。 https://github.com/Jimbe-github/teratail-q351712/ NumberPicker で各色の 16進数を変化させると、上に並んだ3つの●がそれぞれ、16進数そのままの色、"MSE"での近似色、見つけた所の(アルゴリズム名(?)が分からなかったので仮に)"TR"での近似色となり、その色名も表示されます。
guest

回答1

0

ベストアンサー

hoshi-takanori さんがコメントされました URL 先のコードをenum化して試してみましたが… 黒(rgb=0) を指定しても黒にならず orz ←バグでした。(Color.red()等が0~255ではありませんでした)

NamedColor.getApproximateColor を弄ってみてください・・・なレベルになってしまいました。

NamedColor.java

java

1import android.graphics.Color; 2 3enum NamedColor { 4 AliceBlue("AliceBlue", 0xF0F8FF), AntiqueWhite("AntiqueWhite", 0xFAEBD7), Aqua("Aqua", 0x00FFFF), Aquamarine("Aquamarine", 0x7FFFD4), Azure("Azure", 0xF0FFFF), 5 Beige("Beige", 0xF5F5DC), Bisque("Bisque", 0xFFE4C4), Black("Black", 0x000000), BlanchedAlmond("BlanchedAlmond", 0xFFEBCD), Blue("Blue", 0x0000FF), BlueViolet("BlueViolet", 0x8A2BE2), Brown("Brown", 0xA52A2A), BurlyWood("BurlyWood", 0xDEB887), 6 CadetBlue("CadetBlue", 0x5F9EA0), Chartreuse("Chartreuse", 0x7FFF00), Chocolate("Chocolate", 0xD2691E), Coral("Coral", 0xFF7F50), CornflowerBlue("CornflowerBlue", 0x6495ED), Cornsilk("Cornsilk", 0xFFF8DC), Crimson("Crimson", 0xDC143C), Cyan("Cyan", 0x00FFFF), 7 DarkBlue("DarkBlue", 0x00008B), DarkCyan("DarkCyan", 0x008B8B), DarkGoldenrod("DarkGoldenrod", 0xB8860B), DarkGray("DarkGray", 0xA9A9A9), DarkGreen("DarkGreen", 0x006400), DarkKhaki("DarkKhaki", 0xBDB76B), DarkMagenta("DarkMagenta", 0x8B008B), DarkOliveGreen("DarkOliveGreen", 0x556B2F), DarkOrange("DarkOrange", 0xFF8C00), DarkOrchid("DarkOrchid", 0x9932CC), DarkRed("DarkRed", 0x8B0000), DarkSalmon("DarkSalmon", 0xE9967A), DarkSeaGreen("DarkSeaGreen", 0x8FBC8F), DarkSlateBlue("DarkSlateBlue", 0x483D8B), DarkSlateGray("DarkSlateGray", 0x2F4F4F), DarkTurquoise("DarkTurquoise", 0x00CED1), DarkViolet("DarkViolet", 0x9400D3), DeepPink("DeepPink", 0xFF1493), DeepSkyBlue("DeepSkyBlue", 0x00BFFF), DimGray("DimGray", 0x696969), DodgerBlue("DodgerBlue", 0x1E90FF), 8 Firebrick("Firebrick", 0xB22222), FloralWhite("FloralWhite", 0xFFFAF0), ForestGreen("ForestGreen", 0x228B22), Fuchsia("Fuchsia", 0xFF00FF), 9 Gainsboro("Gainsboro", 0xDCDCDC), GhostWhite("GhostWhite", 0xF8F8FF), Gold("Gold", 0xFFD700), Goldenrod("Goldenrod", 0xDAA520), Gray("Gray", 0x808080), Green("Green", 0x008000), GreenYellow("GreenYellow", 0xADFF2F), 10 Honeydew("Honeydew", 0xF0FFF0), HotPink("HotPink", 0xFF69B4), 11 IndianRed("IndianRed", 0xCD5C5C), Indigo("Indigo", 0x4B0082), Ivory("Ivory", 0xFFFFF0), 12 Khaki("Khaki", 0xF0E68C), 13 Lavender("Lavender", 0xE6E6FA), LavenderBlush("LavenderBlush", 0xFFF0F5), LawnGreen("LawnGreen", 0x7CFC00), LemonChiffon("LemonChiffon", 0xFFFACD), LightBlue("LightBlue", 0xADD8E6), LightCoral("LightCoral", 0xF08080), LightCyan("LightCyan", 0xE0FFFF), LightGoldenrodYellow("LightGoldenrodYellow", 0xFAFAD2), LightGray("LightGray", 0xD3D3D3), LightGreen("LightGreen", 0x90EE90), LightPink("LightPink", 0xFFB6C1), LightSalmon("LightSalmon", 0xFFA07A), LightSeaGreen("LightSeaGreen", 0x20B2AA), LightSkyBlue("LightSkyBlue", 0x87CEFA), LightSlateGray("LightSlateGray", 0x778899), LightSteelBlue("LightSteelBlue", 0xB0C4DE), LightYellow("LightYellow", 0xFFFFE0), Lime("Lime", 0x00FF00), LimeGreen("LimeGreen", 0x32CD32), Linen("Linen", 0xFAF0E6), 14 Magenta("Magenta", 0xFF00FF), Maroon("Maroon", 0x800000), MediumAquamarine("MediumAquamarine", 0x66CDAA), MediumBlue("MediumBlue", 0x0000CD), MediumOrchid("MediumOrchid", 0xBA55D3), MediumPurple("MediumPurple", 0x9370DB), MediumSeaGreen("MediumSeaGreen", 0x3CB371), MediumSlateBlue("MediumSlateBlue", 0x7B68EE), MediumSpringGreen("MediumSpringGreen", 0x00FA9A), MediumTurquoise("MediumTurquoise", 0x48D1CC), MediumVioletRed("MediumVioletRed", 0xC71585), MidnightBlue("MidnightBlue", 0x191970), MintCream("MintCream", 0xF5FFFA), MistyRose("MistyRose", 0xFFE4E1), Moccasin("Moccasin", 0xFFE4B5), 15 NavajoWhite("NavajoWhite", 0xFFDEAD), Navy("Navy", 0x000080), 16 OldLace("OldLace", 0xFDF5E6), Olive("Olive", 0x808000), OliveDrab("OliveDrab", 0x6B8E23), Orange("Orange", 0xFFA500), OrangeRed("OrangeRed", 0xFF4500), Orchid("Orchid", 0xDA70D6), 17 PaleGoldenrod("PaleGoldenrod", 0xEEE8AA), PaleGreen("PaleGreen", 0x98FB98), PaleTurquoise("PaleTurquoise", 0xAFEEEE), PaleVioletRed("PaleVioletRed", 0xDB7093), PapayaWhip("PapayaWhip", 0xFFEFD5), PeachPuff("PeachPuff", 0xFFDAB9), Peru("Peru", 0xCD853F), Pink("Pink", 0xFFC0CB), Plum("Plum", 0xDDA0DD), PowderBlue("PowderBlue", 0xB0E0E6), Purple("Purple", 0x800080), 18 Red("Red", 0xFF0000), RosyBrown("RosyBrown", 0xBC8F8F), RoyalBlue("RoyalBlue", 0x4169E1), 19 SaddleBrown("SaddleBrown", 0x8B4513), Salmon("Salmon", 0xFA8072), SandyBrown("SandyBrown", 0xF4A460), SeaGreen("SeaGreen", 0x2E8B57), SeaShell("SeaShell", 0xFFF5EE), Sienna("Sienna", 0xA0522D), Silver("Silver", 0xC0C0C0), SkyBlue("SkyBlue", 0x87CEEB), SlateBlue("SlateBlue", 0x6A5ACD), SlateGray("SlateGray", 0x708090), Snow("Snow", 0xFFFAFA), SpringGreen("SpringGreen", 0x00FF7F), SteelBlue("SteelBlue", 0x4682B4), 20 Tan("Tan", 0xD2B48C), Teal("Teal", 0x008080), Thistle("Thistle", 0xD8BFD8), Tomato("Tomato", 0xFF6347), Turquoise("Turquoise", 0x40E0D0), 21 Violet("Violet", 0xEE82EE), 22 Wheat("Wheat", 0xF5DEB3), White("White", 0xFFFFFF), WhiteSmoke("WhiteSmoke", 0xF5F5F5), 23 Yellow("Yellow", 0xFFFF01), YellowGreen("YellowGreen", 0x9ACD32); 24 25 public static NamedColor getApproximateColor(int rgb) { 26 int min = Integer.MAX_VALUE; 27 int r = Color.red(rgb); 28 int g = Color.green(rgb); 29 int b = Color.blue(rgb); 30 NamedColor color = null; 31 for(NamedColor c : values()) { 32 int mse = c.computeMSE(r, g, b); 33 if(min > mse) { 34 min = mse; 35 color = c; 36 } 37 } 38 return color; 39 } 40 41 private String name; 42 private int r, g, b; 43 44 NamedColor(String name, int rgb) { 45 this.name = name; 46 r = Color.red(rgb); 47 g = Color.green(rgb); 48 b = Color.blue(rgb); 49 } 50 51 public String getName() { return name; } 52 public Color getColor() { return Color.valueOf(Color.rgb(r, g, b)); } 53 public String toString() { 54 StringBuffer sb = new StringBuffer(super.toString()); 55 sb.append("[r=").append(r); 56 sb.append(",g=").append(g); 57 sb.append(",b=").append(b); 58 return sb.append("]").toString(); 59 } 60 61 private int computeMSE(int pr, int pg, int pb) { 62 return (int)(((pr - r) * (pr - r) + (pg - g) * (pg - g) + (pb - b) * (pb - b)) / 3); 63 } 64}

MainActivity.java

java

1import androidx.appcompat.app.AppCompatActivity; 2 3import android.os.Bundle; 4import android.text.*; 5import android.widget.*; 6 7public class MainActivity extends AppCompatActivity { 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.activity_main); 12 13 EditText input = findViewById(R.id.input); 14 TextView output = findViewById(R.id.output); 15 input.addTextChangedListener(new TextWatcher() { 16 @Override 17 public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 18 @Override 19 public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 20 @Override 21 public void afterTextChanged(Editable editable) { 22 try { 23 int rgb = Integer.decode("0x" + editable.toString()); 24 NamedColor nc = NamedColor.getApproximateColor(rgb); 25 output.setText(nc == null ? "(不明)" : nc.getName()); 26 } catch(NumberFormatException e) { 27 output.setText("(エラー)"); 28 } 29 } 30 }); 31 } 32}

レイアウト:
activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<RelativeLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".MainActivity"> 9 10 <EditText 11 android:id="@+id/input" 12 android:layout_width="match_parent" 13 android:layout_height="wrap_content" 14 android:hint="RGB(16進数6桁)" 15 android:inputType="text" 16 android:digits="0123456789abcdef" 17 android:maxLength="6" 18 android:layout_centerInParent="true" /> 19 20 <TextView 21 android:id="@+id/output" 22 android:layout_width="match_parent" 23 android:layout_height="wrap_content" 24 android:text="" 25 android:layout_below="@id/input" 26 android:layout_marginTop="20dp" 27 android:layout_centerHorizontal="true" /> 28 29</RelativeLayout>

投稿2021/07/30 04:14

編集2021/07/30 07:28
jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

schoolstudent

2021/07/30 06:02

わざわざコードを編集してくださり、ありがとうございます!!ここまで丁寧に回答を作成してくださって感謝しかないです; ; 無知で申し訳ないのですが、このコードを今自分が作成したものに付け加えれば動作するのでしょうか、、。それともこれは単体のプログラムで、座標からもとめたカラーコードを引き渡すコードを作る必要があるのでしょうか、、。その場合、どこで最初にint r,g,bにカラーコードを代入すればよいのか教えてくださるとうれしいです。本当に知らないことばかりで申し訳ないです。。。
jimbe

2021/07/30 11:23 編集

そちらでお使い頂くのは NamedColor クラスだけです。MainActivity とレイアウトは NamedColor のテスト・記述サンプルのためだけでした。 NamedColor クラスで主体となるのは、MainActivity で使用してます通り、NamedColor.getApproximateColor(rgb) メソッドです。onTouchEvent メソッド内であればパラメータ rgb として touchedRGB を渡せば、それに近い色の NamedColor 型のオブジェクトが返されます。(近い色が無かった場合は null が返される想定ですが、「黒の近似色として白でさえも出す」ロジックなので、事実上 null は無いでしょうね ^^;;; ) NamedColor オブジェクトが得られれば getName() メソッドで色名が得られます。 int touchedRGB = bmp.getPixel(x, y); NamedColor nc = NamedColor.getApproximateColor(touchedRGB); colorRGB.setText("touched color: " + nc.getName());
schoolstudent

2021/07/30 17:27

わざわざ編集してコードを追加してくださり、ありがとうございます!!先程までプログラムを組んでいて、今回は自力で書いてくださったコードを書くことができていたみたいです!jimbeさんがオープンソースを扱いやすいようにしてくださったおかげですぐに取り入れることができました!本当に助かりました;; ありがとうございました!
schoolstudent

2021/07/30 17:30

どんな質問でも丁寧に回答してくださるおかげで、全くわからなかったjava言語も少しわかるようになってきました!! このサイトと、無知な質問に付き合ってくださるjimbeさんやtakanoriさんのおかげです。プログラムはもともと好きだったのですが、もっと好きになりました!!ありがとうございました!
jimbe

2021/07/30 17:41

近い色を探すというのはやはり感覚的なものを数字で表す必要がある点で奥が深いようで、面白いですね。 私も探しましたら https://www.it-swarm-ja.com/ja/algorithm/色の類似性をチェックするアルゴリズム/971550257/ というのが見つかりまして、二つの距離計算を切り替えられるように NamedColor を改造して結果を比較してみました。 大体は同じ色が出るのですが、例えば 0x558054 が MSE だと "DimGray"、上のサイトのでは "SeaGreen"、 0x0254f0 だと "DodgerBlue" と "RoyalBlue" となったりと、手動で試したので散発的ですがいくつか違いが出ました。
jimbe

2021/07/31 13:01

改造した版は以下の github にあります。 https://github.com/Jimbe-github/teratail-q351712/ java のクラスファイル 3 つとメインのレイアウトがあれば動くと思います。 もちろん NamedColor だけこちらのコードと入れ替えても同じに使えます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問