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

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

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

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

Q&A

解決済

1回答

1115閲覧

p5.jsのサンプルコードで出てきたインデックス番号の計算の意味がわからない

TaichiNakajima

総合スコア10

JavaScript

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

0グッド

0クリップ

投稿2021/07/06 02:51

質問内容

下記の本のP.1.2.2「画像で作るカラーパレット」にて出てくるコードの中で、

p5.js

1 var i = (py * img.width + px) * 4; //⇦ 不明な箇所

という記述があります。(本文中では、ピクセルは配列pixels[]に格納されるため、px, pyから対応するインデックス番号を計算する必要がある、と記載があります)

このインデックス番号を計算する理由と、その式がなぜ、このような形なのかがわからなくて困っています。
(プログラム自体は、画像をロードして、画像をグリッドで分割し、分割したグリッドを色で並び替えることで写真から抽象画を作るようなプログラムです)

Generative Design with p5.js [p5.js版ジェネラティブデザイン] ―ウェブでのクリエイティブ・コーディング Kindle版

p5.js

1// P_1_2_2_01 2// 3// Generative Gestaltung – Creative Coding im Web 4// ISBN: 978-3-87439-902-9, First Edition, Hermann Schmidt, Mainz, 2018 5// Benedikt Groß, Hartmut Bohnacker, Julia Laub, Claudius Lazzeroni 6// with contributions by Joey Lee and Niels Poldervaart 7// Copyright 2018 8// 9// http://www.generative-gestaltung.de 10// 11// Licensed under the Apache License, Version 2.0 (the "License"); 12// you may not use this file except in compliance with the License. 13// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 14// Unless required by applicable law or agreed to in writing, software 15// distributed under the License is distributed on an "AS IS" BASIS, 16// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17// See the License for the specific language governing permissions and 18// limitations under the License. 19 20/** 21 * extract and sort the color palette of an image 22 * 23 * MOUSE 24 * position x : resolution 25 * 26 * KEYS 27 * 1-4 : load different images 28 * 5 : no color sorting 29 * 6 : sort colors on hue 30 * 7 : sort colors on saturation 31 * 8 : sort colors on brightness 32 * 9 : sort colors on greyscale (luminance) 33 * s : save png 34 * c : save color palette 35 */ 36'use strict'; 37 38var img; 39var colors = []; 40var sortMode = null; 41 42function preload() { 43 loadImage('data/pic1.jpg', setImage); 44} 45 46function setup() { 47 createCanvas(600, 600); 48 noCursor(); 49 noStroke(); 50} 51 52function draw() { 53 var tileCount = floor(width / max(mouseX, 5)); 54 var rectSize = width / tileCount; 55 56 img.loadPixels(); 57 colors = []; 58 59 for (var gridY = 0; gridY < tileCount; gridY++) { 60 for (var gridX = 0; gridX < tileCount; gridX++) { 61 var px = int(gridX * rectSize); 62 var py = int(gridY * rectSize); 63 var i = (py * img.width + px) * 4; //⇦ 不明な箇所 64 var c = color(img.pixels[i], img.pixels[i + 1], img.pixels[i + 2], img.pixels[i + 3]); 65 colors.push(c); 66 } 67 } 68 69 gd.sortColors(colors, sortMode); 70 71 var i = 0; 72 for (var gridY = 0; gridY < tileCount; gridY++) { 73 for (var gridX = 0; gridX < tileCount; gridX++) { 74 fill(colors[i]); 75 rect(gridX * rectSize, gridY * rectSize, rectSize, rectSize); 76 i++; 77 } 78 } 79} 80 81function keyReleased() { 82 if (key == 'c' || key == 'C') writeFile([gd.ase.encode(colors)], gd.timestamp(), 'ase'); 83 if (key == 's' || key == 'S') saveCanvas(gd.timestamp(), 'png'); 84 85 if (key == '1') loadImage('data/pic1.jpg', setImage); 86 if (key == '2') loadImage('data/pic2.jpg', setImage); 87 if (key == '3') loadImage('data/pic3.jpg', setImage); 88 if (key == '4') loadImage('data/pic4.jpg', setImage); 89 90 if (key == '5') sortMode = null; 91 if (key == '6') sortMode = gd.HUE; 92 if (key == '7') sortMode = gd.SATURATION; 93 if (key == '8') sortMode = gd.BRIGHTNESS; 94 if (key == '9') sortMode = gd.GRAYSCALE; 95} 96 97function setImage(loadedImageFile) { 98 img = loadedImageFile; 99} 100

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

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

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

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

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

guest

回答1

0

ベストアンサー

ピクセル数の計算

javascript

1 var i = (py * img.width + px) * 4; //⇦ 不明な箇所

pyはy軸のピクセル数ですが、今のピクセルまでの行数と考えられます。
1行のピクセル数はimg.widthなので、これまでの行の総ピクセル数はpy * img.widthになります。

そこに今の行における横のピクセルpxを足すと、そこまでのピクセル数が求まります。

(おそらく)ピクセルの色情報は[Red,Green,Blue,Alpha]の4つ存在します。
なので、1ピクセルあたり4つ配列を使用することになります。

そのため、今のピクセルの色情報の先頭のインデックスがvar i = (py * img.width + px) * 4;で求まります。

色の作成

その後、img.pixels[i](R)、img.pixels[i + 1](G)と順番に色情報を取り出して色としてまとめています。

var c = color(img.pixels[i], img.pixels[i + 1], img.pixels[i + 2], img.pixels[i + 3]);

投稿2021/07/09 07:56

編集2021/07/09 07:56
k4a

総合スコア983

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

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

TaichiNakajima

2021/07/09 09:51

ありがとうございます! 1. ピクセルの総数のお話 2. 1ピクセルあたりRGBで4つの数字を取っている でよく理解できました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問