Я пытаюсь использовать некоторые алгоритмы для написания метода для удаления значения альфа-значения из цвета и получения его одинаковых значений rgb, но, похоже, мой тест всегда терпит неудачу. Я верю, что это называется альфа-смешением? Я не уверен. Это алгоритм, который я использую для преобразования.Преобразование ARGB в RGB в java
public static int removeAlpha(int foreground, int background) {
int redForeground = Color.red(foreground);
int redBackground = Color.red(background);
int greenForeground = Color.green(foreground);
int greenBackground = Color.green(background);
int blueForeground = Color.blue(foreground);
int blueBackground = Color.blue(background);
int alphaForeground = Color.alpha(foreground);
int redNew = (redForeground * alphaForeground) + (redBackground * (1 - alphaForeground));
int greenNew = (greenForeground * alphaForeground) + (greenBackground * (1 - alphaForeground));
int blueNew = (blueForeground * alphaForeground) + (blueBackground * (1 - alphaForeground));
return Color.rgb(redNew, greenNew, blueNew);
}
И тест, как этот
@Test
public void removeAlpha() {
int red = Color.RED;
Assert.assertEquals(0xFFFF7F7F, Heatmap.removeAlpha(red, 0xFFFFFFFF));
}
junit.framework.AssertionFailedError:
Expected :-32897
Actual :-258
когда я рисовать красные в фотошопе и установите непрозрачность на 50%, это дает мне 255,127,127 RGB, который кажется идентичным 50% непрозрачной чистого красного цвета. Я думаю, что алгоритм ложный. Любая помощь будет оценена.
Edit: Вот макет Цвет:
PowerMockito.mockStatic(Color.class);
PowerMockito.when(Color.rgb(Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt())).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
int red = (int) invocation.getArguments()[0];
int green = (int) invocation.getArguments()[1];
int blue = (int) invocation.getArguments()[2];
return (0xFF << 24) | (red << 16) | (green << 8) | blue;
}
});
PowerMockito.when(Color.alpha(Mockito.anyInt())).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return ((int)invocation.getArguments()[0])>>>24;
}
});
PowerMockito.when(Color.red(Mockito.anyInt())).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return (((int)invocation.getArguments()[0])>>16) & 0xFF;
}
});
PowerMockito.when(Color.green(Mockito.anyInt())).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return (((int)invocation.getArguments()[0])>>8) & 0XFF;
}
});
PowerMockito.when(Color.blue(Mockito.anyInt())).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return (int)invocation.getArguments()[0] & 0xFF;
}
});
О забыл упомянуть, что я дразнил статический класс цвета, но это не так важно. Я просто издевался над ними, потому что юнит не позволял меня, не издеваясь над ними. Я просто использовал исходный код, чтобы они работали нормально. –
Ваш формуляр кажется правильным. Однако я понял, что вы игнорируете 'alphaBackground'. Здесь проблема не в этом, так как ваш тест задает это свойство на 100%. – maja
Вы обрабатываете свои значения цвета как диапазон между '[0, 1]'. Возможно ли, что ваши функции 'Color.xx' возвращают значения' [0, 255] '? – maja