- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在编写一个程序,将 BufferedImage
转换为音乐。当我获取 BufferedImage 的宽度和高度时,这些值是正确的。但是,在我用来获取像素的 FOR
循环内,我正在操作 FOR
循环值之一 (i++
)。在 void
的末尾,我将这些值重置为其原始状态 (i--
)。该程序不会评估整个图像,而是给出以下错误:
java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
我应该如何修复这个错误?这是我的代码:
try {
String fp = jTextField1.getText();
File pict = new File(fp);
BufferedImage img = ImageIO.read(pict);
// int keybase = img.getRGB(1, 1);
// int red = (keybase & 0x00ff0000) >> 16;
// int green = (keybase & 0x0000ff00) >> 8;
// int blue = keybase & 0x000000ff;
int width = img.getWidth();
int height = img.getHeight();
String key = null;
int keybase = img.getRGB(1, 1);
int keyred = (keybase & 0x00ff0000) >> 16;
int keygreen = (keybase & 0x0000ff00) >> 8;
int keyblue = keybase & 0x000000ff;
int keyAvg = (keyred + keygreen + keyblue) / 3;
if (keyAvg <= 10) {
key = "Cmaj";
}
else if (keyAvg <=20 && keyAvg > 10) {
key = "Cmin";
}
else if (keyAvg <=30 && keyAvg > 20) {
key = "C#maj";
}
else if (keyAvg <=40 && keyAvg > 30) {
key = "C#min";
}
else if (keyAvg <=50 && keyAvg > 40) {
key = "Dmaj";
}
else if (keyAvg <=60 && keyAvg > 50) {
key = "Dmin";
}
else if (keyAvg <=70 && keyAvg > 60) {
key = "D#maj";
}
else if (keyAvg <=80 && keyAvg > 70) {
key = "D#min";
}
else if (keyAvg <=90 && keyAvg > 80) {
key = "Emaj";
}
else if (keyAvg <=100 && keyAvg > 90) {
key = "Emin";
}
else if (keyAvg <=110 && keyAvg > 100) {
key = "Fmaj";
}
else if (keyAvg <=120 && keyAvg > 110) {
key = "Fmin";
}
else if (keyAvg <=130 && keyAvg > 120) {
key = "F#maj";
}
else if (keyAvg <=140 && keyAvg > 130) {
key = "F#min";
}
else if (keyAvg <=150 && keyAvg > 140) {
key = "Gmaj";
}
else if (keyAvg <=160 && keyAvg > 150) {
key = "Gmin";
}
else if (keyAvg <=170 && keyAvg > 160) {
key = "G#maj";
}
else if (keyAvg <=180 && keyAvg > 170) {
key = "G#min";
}
else if (keyAvg <=190 && keyAvg > 180) {
key = "Amaj";
}
else if (keyAvg <=200 && keyAvg > 190) {
key = "Amin";
}
else if (keyAvg <=210 && keyAvg > 200) {
key = "A#maj";
}
else if (keyAvg <=220 && keyAvg > 210) {
key = "A#min";
}
else if (keyAvg <=230 && keyAvg > 220) {
key = "Bmaj";
}
else {
key = "Bmin";
}
int tempoVal = 0;
int tempobase = img.getRGB(2, 2);
int tempored = (tempobase & 0x00ff0000) >> 16;
int tempogreen = (tempobase & 0x0000ff00) >> 8;
int tempoblue = tempobase & 0x000000ff;
if (tempored > tempogreen && tempored > tempoblue) {
tempoVal = tempored;
}
else if (tempogreen > tempored && tempogreen > tempoblue) {
tempoVal = tempogreen;
}
else if (tempoblue > tempored && tempoblue > tempogreen) {
tempoVal = tempoblue;
}
else {
tempoVal = 120;
}
String tempo = "T" + String.valueOf(tempoVal) + " ";
String inst;
int instbase = img.getRGB(3, 3);
int red5 = (instbase & 0x00ff0000) >> 16;
int green5 = (instbase & 0x0000ff00) >> 8;
int blue5 = instbase & 0x000000ff;
int instAvg = (red5 + green5 + blue5) / 3;
if (instAvg > 111) {
instAvg = instAvg / 2;
inst = "I" + String.valueOf(instAvg) + " ";
}
else {
inst = "I" + String.valueOf(instAvg) + " ";
}
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int note = img.getRGB(i, j);
int red = (note & 0x00ff0000) >> 16;
int green = (note & 0x0000ff00) >> 8;
int blue = note & 0x000000ff;
int noteAvg = (red + green + blue) / 3;
if (noteAvg >= 127) {
noteAvg = noteAvg / 2;
}
String nAvg = String.valueOf(noteAvg);
i++;
int len = img.getRGB(i, j);
int red2 = (len & 0x00ff0000) >> 16;
int green2 = (len & 0x0000ff00) >> 8;
int blue2 = len & 0x000000ff;
int noteAvg2 = (red2 + green2 + blue2) / 3;
String noteLen;
String keyVar = null;
if (noteAvg2 <= 42) {
noteLen = "W";
}
else if (noteAvg2 <= (42 * 2) && noteAvg2 > 42) {
noteLen = "H";
}
else if (noteAvg2 <= (42 * 3) && noteAvg2 > (42 * 2)) {
noteLen = "Q";
}
else if (noteAvg2 <= (42 * 4) && noteAvg2 > (42 * 3)) {
noteLen = "I";
}
else if (noteAvg2 <= (42 * 5) && noteAvg2 > (42 * 4)) {
noteLen = "S";
}
else {
noteLen = "T";
}
i++;
int keyvarbase = img.getRGB(i, j);
int red4 = (keyvarbase & 0x00ff0000) >> 16;
int green4 = (keyvarbase & 0x0000ff00) >> 8;
int blue4 = keyvarbase & 0x000000ff;
int noteAvg4 = (red4 + green4 + blue4) / 3;
int findKeyVar = noteAvg4 % 4;
if (findKeyVar == 1) {
keyVar = "min";
}
else if (findKeyVar == 2) {
keyVar = "maj";
}
else if (findKeyVar == 3) {
keyVar = "aug";
}
else {
keyVar = "dim";
}
i++;
int inv = img.getRGB(i, j);
int red3 = (inv & 0x00ff0000) >> 16;
int green3 = (inv & 0x0000ff00) >> 8;
int blue3 = inv & 0x000000ff;
int noteAvg3 = (red3 + green3 + blue3) / 3;
String inversion = null;
if (noteAvg3 <= (85 * 2) && noteAvg3 > 85) {
inversion = "^";
}
else if (noteAvg3 <= (85 * 3) && noteAvg3 > (85 * 2)) {
inversion = "^^";
}
if (noteAvg == 0) {
}
else {
String forPlayer = tempo + inst + "K" + key + " [" + nAvg + "]" + keyVar + noteLen;
midi.add(forPlayer);
midi.add("_");
player.play(forPlayer);
}
i--;
i--;
i--;
}
}
} catch (IOException ex) {
Logger.getLogger(I2MC.class.getName()).log(Level.SEVERE, null, ex);
}
我正在使用 JFugue API。
最佳答案
要么
for (int i = 0; i < width - 3; i++) { // Will use index i+3
或if
。
当您在循环内执行三次 i++
并使用 i
作为索引时,然后执行三次 i--
,在单个循环步骤开始时,i+3 必须小于宽度才能成为有效索引。
虽然你的风格很细致,但使用
final int i1 = i + 1;
final int i2 = i + 2;
final int i3 = i + 3;
可能会使代码更具可读性。
使用 i++
的算法证明会更复杂,看起来像:
// Define VALID_I(index) = (0 <= index < width)
for (int i = 0; i < width - 3; i++) { // Will use index i+3
// Step pre-condition: 0 <= i < width - 3} => VALID_I(i)
... getRGG(i, j);
i++;
// 1 <= i < width - 2 => VALID_I(i)
i++;
// 1 <= 2 < width - 1 => VALID_I(i)
i++;
// 1 <= 3 < width => VALID_I(i)
i -= 3;
// Step post-condition: 0 <= i < width - 3} => VALID_I(i)
// Loop-invariant: Step post-condition == step pre-codition
}
与 if 的替代:
for (int i = 0; i < width; i++) {//将使用索引 i+3 //步骤前置条件:0 <= i < width} <=> VALID_I(i) ... getRGG(i, j); 我++; //1 <= i < 宽度 + 1 => VALID_I(i) 如果 (i + 1 >= 宽度) 休息; //1 <= i < 宽度 => VALID_I(i) 我++; 如果 (i + 1 >= 宽度) 休息; //2 <= i < 宽度 => VALID_I(i) 我++; 如果 (i + 1 >= 宽度) 休息; //3 <= i < 宽度 =e > VALID_I(i) 我-= 3; //0 <= i < 宽度 - 3 => VALID_I(i) //步骤后置条件:0 <= i < width - 3} => VALID_I(i) //循环不变:步骤后置条件 == 步骤前置条件}
与嵌套 if 相同的替代方案。
当 i >= width - 3 时,这三种替代方案具有不同的行为。
关于java - 在操作高度值时从 BufferedImage 获取像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14169848/
我的问题:非常具体。我正在尝试想出解析以下文本的最简单方法: ^^domain=domain_value^^version=version_value^^account_type=account_ty
好吧,这就是我的困境: 我正在为 Reddit 子版 block 开发常见问题解答机器人。我在 bool 逻辑方面遇到了麻烦,需要一双更有经验的眼睛(这是我在 Python 中的第一次冒险)。现在,该
它首先遍历所有 y 值,然后遍历所有 x 值。我需要 X 和 y 同时改变。 For x = 3 To lr + 1 For y = 2 To lr anyl.Cells(x, 1)
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
如何转换 Z-score来自 Z-distribution (standard normal distribution, Gaussian distribution)到 p-value ?我还没有找到
我正在重写一些 Javascript 代码以在 Excel VBA 中工作。由于在这个网站上搜索,我已经设法翻译了几乎所有的 Javascript 代码!但是,有些代码我无法准确理解它在做什么。这是一
我遇到过包含日期格式的时间戳日期的情况。然后我想构建一个图表,显示“点击”项目的数量“每天”, //array declaration $array1 = array("Date" => 0); $a
我是scala的新手! 我的问题是,是否有包含成员的案例类 myItem:Option[String] 当我构造类时,我需要将字符串内容包装在: Option("some string") 要么 So
我正在用 PHP 创建一个登录系统。我需要用户使用他或她的用户名或电子邮件或电话号码登录然后使用密码。因为我知道在 Java 中我们会像 email==user^ username == user 这
我在 C++ 项目上使用 sqlite,但是当我在具有文本值的列上使用 WHERE 时出现问题 我创建了一个 sqlite 数据库: CREATE TABLE User( id INTEGER
当构造函数是显式时,它不用于隐式转换。在给定的代码片段中,构造函数被标记为 explicit。那为什么在 foo obj1(10.25); 情况下它可以工作,而在 foo obj2=10.25; 情况
我知道这是一个主观问题,所以如果需要关闭它,我深表歉意,但我觉得它经常出现,让我想知道是否普遍偏爱一种形式而不是另一种形式。 显然,最好的答案是“重构代码,这样你就不需要测试是否存在错误”,但有时没有
这两个 jQuery 选择器有什么区别? 以下是来自 w3schools.com 的定义: [attribute~=value] 选择器选择带有特定属性,其值包含特定字符串。 [attribute*=
为什么我们需要CSS [attribute|=value] Selector根本当 CSS3 [attribute*=value] Selector基本上完成相同的事情,浏览器兼容性几乎相似?是否存在
我正在解决 regx 问题。我已经有一个像这样的 regx [0-9]*([.][0-9]{2})。这是 amont 格式验证。现在,通过此验证,我想包括不应提供 0 金额。比如 10 是有效的,但
我正在研究计算机科学 A 考试的样题,但无法弄清楚为什么以下问题的正确答案是正确的。 考虑以下方法。 public static void mystery(List nums) { for (
好的,我正在编写一个 Perl 程序,它有一个我收集的值的哈希值(完全在一个完全独立的程序中)并提供给这个 Perl 脚本。这个散列是 (string,string) 的散列。 我想通过 3 种方式对
我有一个表数据如下,来自不同的表。仅当第三列具有值“债务”并且第一列(日期)具有最大值时,我才想从第四列中获取最大值。最终值基于 MAX(DATE) 而不是 MAX(PRICE)。所以用简单的语言来说
我有一个奇怪的情况,只有错误状态保存到数据库中。当“状态”应该为 true 时,我的查询仍然执行 false。 我有具有此功能的 Controller public function change_a
我有一个交易表(针对所需列进行了简化): id client_id value 1 1 200 2 2 150 3 1
我是一名优秀的程序员,十分优秀!