Untitled

mail@pastecode.io avatar
unknown
c_cpp
a year ago
2.1 kB
4
Indexable
Never
color allColor[32768];

    for (int i = 0; i < 32768; i++)
    {
        allColor[i].r = i >> 10;
        allColor[i].g = (i % 1024) >> 5;
        allColor[i].b = i % 32;
        allColor[i].number = 0;
    }

    // record times
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            int nowPixel = (x + y * width) * 4;
            data[nowPixel + RED] = data[nowPixel + RED] / 8;
            data[nowPixel + GREEN] = data[nowPixel + GREEN] / 8;
            data[nowPixel + BLUE] = data[nowPixel + BLUE] / 8;

            int index = (data[nowPixel + RED] << 10) + (data[nowPixel + GREEN] << 5) + data[nowPixel + BLUE];
            allColor[index].number++;
        }
    }

    // sort
    qsort(allColor, 32768, sizeof(color), compare);

    // DP time
    int search[32768];
    memset(search, -1, sizeof(search));

    // maping
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            int nowPixel = (x + y * width) * 4;
            int rgb[3], index = 0;

            rgb[RED] = data[nowPixel + RED];
            rgb[GREEN] = data[nowPixel + GREEN];
            rgb[BLUE] = data[nowPixel + BLUE];

            int colorKey = (rgb[RED] << 10) + (rgb[GREEN] << 5) + rgb[BLUE];
            index = search[colorKey];

            if (index == -1)
            {
                int temp = 0, distance = 999999;
                // calculate distance
                for (int i = 0; i < 256; i++)
                {
                    temp = (int)(pow(rgb[RED] - allColor[i].r, 2) + pow(rgb[GREEN] - allColor[i].g, 2) + pow(rgb[BLUE] - allColor[i].b, 2));
                    if (temp < distance)
                    {
                        index = i;
                        distance = temp;
                    }
                }
                search[colorKey] = index;
            }

            data[nowPixel + RED] = allColor[index].r * 8;
            data[nowPixel + GREEN] = allColor[index].g * 8;
            data[nowPixel + BLUE] = allColor[index].b * 8;
        }
    }