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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

231閲覧

fillStyle の値が変わる?

Popo

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2024/10/21 09:45

編集2024/10/22 00:09

実現したいこと

初めて質問します。
よろしくお願いします。

const ctx = document.getElementById("canvas").getContext("2d");
dataText = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18"
const splText = String(dataText).split(",");
let rgb = 0;
for (let i = 0; i < 6; i++) {
for (let j = 0; j < 6; j++) {
const r = splText [rgb];
const g = splText [(rgb + 1)];
const b = splText [(rgb + 2)];
ctx.beginPath();
ctx.fillStyle = "rgb(" + Number(r) + "," + Number(g) + "," + Number(b) + ")";
ctx.fillRect(j * 1, i * 1, 1, 1);
ctx.stroke();
rgb = rgb + 3;
}
}

で、dataText(数値は例) で指定した数値で塗りつぶしたいです。

発生している問題・分からないこと

//追記部分で取得した色(rgb)が fillStyle で塗りつぶした色(rgb数値)と違う時がある。
firefoxでしか検証していないのですが、
dataText でrgb(1,2,3)となっているのに取得した色はrgb(1,2,3)ではない数値になったりもします。
数値が変わってしまうのはどこのコードに問題があるのでしょうか。
それとも何かコードが足りていないのでしょうか。

該当のソースコード

const ctx = document.getElementById("canvas").getContext("2d"); dataText = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18" const splText = String(dataText).split(","); let rgb = 0; for (let i = 0; i < 6; i++) { for (let j = 0; j < 6; j++) {   const r = splText [rgb]; const g = splText [(rgb + 1)]; const b = splText [(rgb + 2)]; ctx.beginPath(); ctx.fillStyle = "rgb(" + Number(r) + "," + Number(g) + "," + Number(b) + ")"; ctx.fillRect(j * 1, i * 1, 1, 1); ctx.stroke(); //追記部分 window.alert(Number(r) + "," + Number(g) + "," + Number(b)); ctx.beginPath(); const dataTest1 = ctx.getImageData(j * 1, i * 1, 1, 1); const dataTest2 = dataTest1.data; const dataTest3 = String(dataTest2).split(",", 3); window.alert(dataTest3); // rgb = rgb + 3; } }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

いろいろ調べて試してみたのですが、違う数値がが出ることを解決できませんでした。

補足

特になし

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

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

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

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

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

yambejp

2024/10/21 10:32 編集

rgb1ってなんでしょう?とりあえず動くソースをお願いします
Popo

2024/10/21 12:11

コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。
yambejp

2024/10/21 12:47

エラーにならないソースを提示ください
Popo

2024/10/21 22:19

重ね重ね申し訳ありません。 バックアップ用の未修正のデータで記載していました。 修正しましたのでご確認お願いします。
int32_t

2024/10/21 22:32

変数 rgb1 には何が入っているのでしょうか。 > 取得した色はrgb(1,2,3)ではない数値に 具体的にはどのような値になっているのでしょうか。
Popo

2024/10/21 23:00

本当に申し訳ありません。 修正しました。 よろしくお願いします。
int32_t

2024/10/21 23:41

変数rgbがconstなので今のコードは動きませんね。 それで、i j r g b がどういう値のときに dataTest3 の値がどのようになるのか、具体的な症状を教えてもらえませんか。
Popo

2024/10/22 00:18

申し訳ありません。 rgbのconstをletに修正しました。 dataTest3 の値ですが、 ブラウザを起動→サイトに移動→JSを実行→ブラウザを閉じる 上記の行動をするたびに変わってしまいます。 例)一回目の行動だとJS実行時にはrgb(1,2,3)がrgb(2,2,3)になる 例)二回目の行動だとJS実行時にはrgb(1,2,3)がrgb(1,2,3)になる 例)三回目の行動だとJS実行時にはrgb(1,2,3)がrgb(0,3,3,)になる という感じです。 一回目の行動をブラウザを閉じずにJSを再実行するとrgb(1,2,3)がrgb(2,2,3)と同じ結果が出ます。
int32_t

2024/10/22 00:31

i==0 j==0 のときに問題が発生するのですね。 質問文のコードでは i==0 j==0 のときにそのような問題が起きるようには見えません。 質問者さんは質問文にあるコードそのまま追加コードなしで問題が発生するのですよね? Firefox以外のブラウザではどうなりますか。
Popo

2024/10/22 00:39

chomeで実行してみました。 何度やっても正常に動作しました。。。 ブラウザの問題ということでしょうか。
int32_t

2024/10/22 01:01

> ブラウザの問題ということでしょうか。 そうだと思います。
Popo

2024/10/22 01:47

ブラウザ問題の可能性が高いのですね。 コメント、コードのご指摘、一緒に考えてくださり ありがとうございます。
juner

2024/10/22 01:57

firefox のバージョンはどのバージョンとなりますでしょうか? 現在のバージョンは 131.0.3 あたりと思われますが……。
Popo

2024/10/22 02:05

バージョンは 131.0.3 (64 ビット) です。
guest

回答1

0

問題点が明確ではないですね
たとえばこうするとどうでしょう?

javascript

1let rgb = 0; 2for (let i = 0; i < 6; i++) { 3for (let j = 0; j < 6; j++) { 4↓↓↓ 5let rgb = 0; 6for (let i = 0; i < 6; i++) { 7rgb=0; 8for (let j = 0; j < 6; j++) {

全文

canvasに十分なサイズを取ってみる

html

1<canvas id="canvas" width=100 height=100></canvas> 2<script> 3const ctx = document.getElementById("canvas").getContext("2d"); 4 dataText = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18" 5 const splText = String(dataText).split(","); 6 let rgb = 0; 7 for (let i = 0; i < 6; i++) { 8 rgb = 0; 9 for (let j = 0; j < 6; j++) { 10  const r = splText [rgb]; 11 const g = splText [(rgb + 1)]; 12 const b = splText [(rgb + 2)]; 13 ctx.beginPath(); 14 ctx.fillStyle = "rgb(" + Number(r) + "," + Number(g) + "," + Number(b) + ")"; 15 ctx.fillRect(j * 1, i * 1, 1, 1); 16 ctx.stroke(); 17 18 //追記部分 19 window.alert(Number(r) + "," + Number(g) + "," + Number(b)); 20 ctx.beginPath(); 21 const dataTest1 = ctx.getImageData(j * 1, i * 1, 1, 1); 22 const dataTest2 = dataTest1.data; 23 const dataTest3 = String(dataTest2).split(",", 3); 24 window.alert(dataTest3); 25 // 26 27 rgb = rgb + 3; 28 } 29 } 30</script>

一覧表示

ちょっとだけリファクタリングして一覧表示にしました
これでi,jがいくつのときにどう値が違うか確認してみてください

html

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 const ctx = document.getElementById("canvas").getContext("2d"); 4 const dataText = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18"; 5 const dataArray =dataText.split(",").map(Number); 6 let rgb = 0; 7 for (let i = 0; i < 6; i++) { 8 rgb = 0; 9 for (let j = 0; j < 6; j++) { 10 output.value+=`i:${i}/j:${j}/`; 11 const r = dataArray [rgb]; 12 const g = dataArray [rgb + 1]; 13 const b = dataArray [rgb + 2]; 14 ctx.beginPath(); 15 ctx.fillStyle = `rgb(${r},${g},${b})`; 16 ctx.fillRect(j * 1, i * 1, 1, 1); 17 ctx.stroke(); 18 19 output.value+=`${r},${g},${b}-`; 20 ctx.beginPath(); 21 const dataTest1 = ctx.getImageData(j * 1, i * 1, 1, 1); 22 const dataTest2 = dataTest1.data; 23 const dataTest3 = String(dataTest2).split(",", 3); 24 output.value+=dataTest3+"\n"; 25 rgb = rgb + 3; 26 } 27 output.value+="-------------------------\n"; 28 } 29}); 30 31</script> 32 33<canvas id="canvas" width=100 height=100></canvas> 34<textarea id="output" rows=40 cols=40></textarea>

追加テスト

私の環境だと300*300の9万件やってもヒットしないですね
ただ、firefoxは処理がかなり重いです。chromeだと早いんですが・・・

html

1<canvas id="canvas" width=300 height=300></canvas> 2<script> 3const ctx = document.getElementById("canvas").getContext("2d"); 4 dataText = "0,49,50,51,10,65,66,67,10,227,129,130,227,129,132,227,129,134"; 5 const splText = String(dataText).split(","); 6 for (let i = 0; i < 300; i++) { 7 for (let j = 0; j < 300; j+=3) { 8 const r = splText [j%splText.length]; 9 const g = splText [(j+1)%splText.length]; 10 const b = splText [(j+2)%splText.length]; 11 ctx.beginPath(); 12 ctx.fillStyle = "rgb(" + Number(r) + "," + Number(g) + "," + Number(b) + ")"; 13 ctx.fillRect(j, i, 1, 1); 14 ctx.stroke(); 15 const rgb1 = [r,g,b].map(x=>Number(x).toString(16).padStart(2,'0')).join(''); 16 17 ctx.beginPath(); 18 const dataTest1 = ctx.getImageData(j, i, 1, 1); 19 const dataTest2 = dataTest1.data; 20 const rgb2 = [...dataTest2].splice(0,3).map(x=>x.toString(16).padStart(2,'0')).join(''); 21 if(rgb1!==rgb2) console.log([i,j,rgb1,rgb2]); 22 } 23 } 24</script>

投稿2024/10/22 00:29

編集2024/10/23 02:14
yambejp

総合スコア116250

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

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

Popo

2024/10/22 00:51

回答ありがとうございます。試してみましたが解決できませんでした。 色数値が同じ時もありますが変わってしまう時も出てきます。 i = 0 のときはrgb(1,2,3)がrgb(1,2,3)と同じだったのに i = 1 のときはrgb(1,2,3)がrgb(0,2,2)と変わってたり 実行するたびに変わってしまいます。 firefoxの設定も関係あるのでしょうか。。。
yambejp

2024/10/22 00:59

canvasのサイズがおかしいのかもしれません 全文参考用に記載しておきましたのでコピペして動作を確認してみてください
Popo

2024/10/22 01:52

yambejpさん 他の方のご意見もあったのですが、chomeだと問題なく動作します。 ブラウザの問題の可能性も出てきたのですが、firefoxだけなのですかね。。。 junerさん livecodesというサイトをはじめて知りました! 教えていただき、コードを作っていただき ありがとうございます。
yambejp

2024/10/22 02:13

Popoさん わたしの環境:win10のfirefox131.0.3 (64 ビット)では問題ないですね
juner

2024/10/22 02:18 編集

Popo さん、 yambejp さん、 一つ目と二つ目 の値が変わるか確認して、変わったら 赤く塗る様に しましたが firefox でも発生しませんでした。 https://livecodes.io/?x=id/ea52ypqx4rd 発生しますでしょうか?それとも私の認識が間違っていますでしょうか? ※ livecodes で共有する場合は 右上の共有ボタンから Get short URL をすると 短いURLになるので共有するときはこっちを使った方がいいです(長すぎるURLは文字数制限とかに引っ掛かりやすいので
yambejp

2024/10/22 02:33

デバッグしやすいように追記しておきました
Popo

2024/10/22 04:02

junerさん ありがとうございます。 こちらのコードですと私のほうでも正常に動作しました。
Popo

2024/10/22 04:03

yambejpさん ありがとうございます。 結果は以下の通りで、正常に動作しました。 i:0/j:0/1,2,3-1,2,3 i:0/j:1/4,5,6-4,5,6 i:0/j:2/7,8,9-7,8,9 i:0/j:3/10,11,12-10,11,12 i:0/j:4/13,14,15-13,14,15 i:0/j:5/16,17,18-16,17,18 ------------------------- i:1/j:0/1,2,3-1,2,3 i:1/j:1/4,5,6-4,5,6 i:1/j:2/7,8,9-7,8,9 i:1/j:3/10,11,12-10,11,12 i:1/j:4/13,14,15-13,14,15 i:1/j:5/16,17,18-16,17,18 ------------------------- i:2/j:0/1,2,3-1,2,3 i:2/j:1/4,5,6-4,5,6 i:2/j:2/7,8,9-7,8,9 i:2/j:3/10,11,12-10,11,12 i:2/j:4/13,14,15-13,14,15 i:2/j:5/16,17,18-16,17,18 ------------------------- i:3/j:0/1,2,3-1,2,3 i:3/j:1/4,5,6-4,5,6 i:3/j:2/7,8,9-7,8,9 i:3/j:3/10,11,12-10,11,12 i:3/j:4/13,14,15-13,14,15 i:3/j:5/16,17,18-16,17,18 ------------------------- i:4/j:0/1,2,3-1,2,3 i:4/j:1/4,5,6-4,4,6 i:4/j:2/7,8,9-7,8,9 i:4/j:3/10,11,12-10,11,12 i:4/j:4/13,14,15-13,14,15 i:4/j:5/16,17,18-16,17,18 ------------------------- i:5/j:0/1,2,3-1,2,3 i:5/j:1/4,5,6-4,5,6 i:5/j:2/7,8,9-7,8,9 i:5/j:3/10,11,12-10,11,12 i:5/j:4/13,14,15-13,14,15 i:5/j:5/16,17,18-16,17,18 -------------------------
yambejp

2024/10/22 04:08

うーん普通に動作しているみたいですね。 ご自身のソースにoutput用のデバッグ処理を追加して検証はできないでしょうか?
Popo

2024/10/22 04:44

yambejpさん さきほどのoutput用のデバッグ処理を使わせていただき、数値をすこし変えて実行してみました。 変更した数値:0,49,50,51,10,65,66,67,10,227,129,130,227,129,132,227,129,134 結果は以下の通りなのですが、やはり数値が変わってしまっている箇所が出ます。 i:0/j:0/0,49,50-0,49,50 i:0/j:1/51,10,65-51,10,65 i:0/j:2/66,67,10-66,67,10 i:0/j:3/227,129,130-227,129,130 i:0/j:4/227,129,132-227,129,132 i:0/j:5/227,129,134-227,128,134 ------------------------- i:1/j:0/0,49,50-0,49,50 i:1/j:1/51,10,65-51,10,65 i:1/j:2/66,67,10-66,67,11 i:1/j:3/227,129,130-227,129,130 i:1/j:4/227,129,132-227,129,132 i:1/j:5/227,129,134-227,129,134 ------------------------- i:2/j:0/0,49,50-0,49,50 i:2/j:1/51,10,65-51,10,65 i:2/j:2/66,67,10-66,67,10 i:2/j:3/227,129,130-227,129,130 i:2/j:4/227,129,132-227,129,132 i:2/j:5/227,129,134-225,129,134 ------------------------- i:3/j:0/0,49,50-0,49,50 i:3/j:1/51,10,65-51,10,65 i:3/j:2/66,67,10-67,67,10 i:3/j:3/227,129,130-227,129,130 i:3/j:4/227,129,132-227,129,132 i:3/j:5/227,129,134-227,129,134 ------------------------- i:4/j:0/0,49,50-0,49,48 i:4/j:1/51,10,65-51,10,64 i:4/j:2/66,67,10-66,67,10 i:4/j:3/227,129,130-227,129,128 i:4/j:4/227,129,132-227,129,134 i:4/j:5/227,129,134-227,129,134 ------------------------- i:5/j:0/0,49,50-0,49,50 i:5/j:1/51,10,65-49,10,65 i:5/j:2/66,67,10-66,67,10 i:5/j:3/227,129,130-227,129,130 i:5/j:4/227,129,132-225,128,132 i:5/j:5/227,129,134-227,129,134 ------------------------- i:6/j:0/0,49,50-0,49,50 i:6/j:1/51,10,65-51,10,65 i:6/j:2/66,67,10-66,67,10 i:6/j:3/227,129,130-227,129,130 i:6/j:4/227,129,132-227,129,132 i:6/j:5/227,129,134-227,129,134 -------------------------
juner

2024/10/22 05:26

その変わってしまう場合 の ソースを どこかの playground に載せて再現できる状態で共有できますでしょうか?( livecodes に限らず codepen とか 好きなのでいいですが。
yambejp

2024/10/23 02:15

再調整してみたのですがやはり環境依存なのかもしれません テストしてみてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問