質問内容
下記の本の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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/09 09:51