Nano Hash - криптовалюты, майнинг, программирование

Как преобразовать шестнадцатеричный цвет в java?

У меня есть шестнадцатеричный цвет rgb и черно-белая маска. Это два целочисленных массива:

mColors = new int[] {
                 0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00,
                 0xFFFFFF00, 0xFFFF0000
             };
mColorsMask = new int[] {
                     0xFFFFFFFF, 0xFF000000, 0xFFFFFFFF, 0xFF000000, 0xFFFFFFFF,
                     0xFFFFFFFF, 0xFF000000
                 };

Мне нужно преобразовать мой цвет в черный значение в зависимости от контраста. Контраст — это целочисленное значение в диапазоне от 0 до 255: введите здесь описание изображения

С белым все нормально, добавляю байт:

int newHexColor = (contrast << 16) | (contrast << 8) | contrast | mColors[i];
newColorsArray[i] = mode;

Как сделать его черным?

24.11.2012

  • Я не совсем уверен в вопросе здесь - в основном отношения между вещами. У вас есть пример того, что должно быть черным? 25.11.2012
  • Нет, я не видел. Мне надо изменить значения seekBar, и мой градиент должен превратиться в черно-белый. Я изменил цвет на белый, но не могу изменить цвет на черный. 25.11.2012
  • И должно ли значение черного/белого быть связано со значением маски или...? 25.11.2012
  • Здесь он используется для примера. На самом деле маска имеет контрастное значение. 1,3,5,7 элементов массива mColors становятся белыми, а 2,4,6 — черными. 25.11.2012

Ответы:


1

Вы можете изучить использование цветового пространства HSB. Это кажется гораздо более подходящим для того, что вы пытаетесь сделать. В частности, вы видите те углы, которые заканчиваются черными на вашем изображении «чего я хочу»? Они соответствуют «оттенкам» при 60, 180 и 300 градусах (1.0/6, 3.0/6 и 5.0/6 в Java). Белый цвет соответствует 0, 120 и 240 градусам (0, 1,0/3 и 2,0/3 в Java), и не случайно цвета под этими углами являются основными цветами (то есть два из трех компонентов RGB являются нуль).

Что вам нужно сделать, так это найти разницу между оттенком вашего цвета и ближайшим основным цветом. (Должно быть меньше 1/6.) Увеличьте его (умножьте на 6), чтобы получить значение от 0 до 1,0. Это даст вам значение «примеси», которое в основном представляет собой отклонение от ближайшего основного цвета. Конечно, это число, вычтенное из 1,0, дает вам «чистоту» или близость к основному цвету.

Вы можете создать цвет в оттенках серого на основе примеси или чистоты, используя соответствующие значения в качестве R, G и B с альфа-каналом 1,0f.

public Color getMaskColor(Color c) {
    float[] hsv = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null);
    float hue = hsv[0];

    // 0, 1/3, and 2/3 are the primary colors.  Find the closest one to c,
    // by rounding c to the nearest third.
    float nearestPrimaryHue = Math.round(hue * 3.0f) / 3.0f;

    // difference between hue and nearestPrimaryHue <= 1/6
    // Multiply by 6 to get a value between 0 and 1.0
    float impurity = Math.abs(hue - nearestPrimaryHue) * 6.0f;
    float purity = 1.0f - impurity;

    // return a greyscale color based on the "purity"
    // (for #FF0000, would return white)
    // using impurity would return black instead
    return new Color(purity, purity, purity, 1.0f);
}

Вы можете либо использовать цветовой компонент возвращаемого цвета в качестве значения «контрастности», либо изменить функцию так, чтобы она возвращала «чистоту» или «примесь» по мере необходимости.

Обратите внимание, что математика становится шаткой с оттенками серого. (То, как Java вычисляет HSB, чистые серые цвета - это просто красные (оттенок = 0) без оттенка (насыщенность = 0). Единственный компонент, который изменяется, - это яркость.) Но поскольку ваше цветовое колесо не имеет оттенков серого...

25.11.2012

2

Вы можете сделать изображение черно-белым, используя контраст.

Смотри код..

public static Bitmap createContrast(Bitmap src, double value) {
    // image size
    int width = src.getWidth();
    int height = src.getHeight();
    // create output bitmap
    Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());
    // color information
    int A, R, G, B;
    int pixel;
    // get contrast value
    double contrast = Math.pow((100 + value) / 100, 2);

    // scan through all pixels
    for(int x = 0; x < width; ++x) {
        for(int y = 0; y < height; ++y) {
            // get pixel color
            pixel = src.getPixel(x, y);
            A = Color.alpha(pixel);
            // apply filter contrast for every channel R, G, B
            R = Color.red(pixel);
            R = (int)(((((R / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
            if(R < 0) { R = 0; }
            else if(R > 255) { R = 255; }

            G = Color.red(pixel);
            G = (int)(((((G / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
            if(G < 0) { G = 0; }
            else if(G > 255) { G = 255; }

            B = Color.red(pixel);
            B = (int)(((((B / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
            if(B < 0) { B = 0; }
            else if(B > 255) { B = 255; }

            // set new pixel color to output bitmap
            bmOut.setPixel(x, y, Color.argb(A, R, G, B));
        }
    }

    return bmOut;
 }

Установите значение double равным 50 при вызове метода. Например createContrast(Bitmap src, 50)

24.11.2012
  • Как это отвечает на вопрос? 25.11.2012
  • Извините, но я не понял вопроса, возможно, обновление поможет вам. 25.11.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..