从字符串中获取主角

时间:2014-09-02 23:38:25

标签: c bitmap output pixels

好吧..根据标题,我试图找出一种方法 - 返回在字符串中占主导地位的字符的函数。我或许可以弄清楚..但是我的逻辑看起来有些不对劲而且我在这方面失败了。如果有人能够毫无问题地提出这个问题,我将非常高兴地感谢你。

我说"在一个字符串"使它更简化。我实际上是从包含BMP图像的缓冲数据中做到这一点。试图输出基色(主要像素)。

我现在拥有的是我开始的未完成的功能:

RGB
bitfox_get_primecolor_direct
(char *FILE_NAME)
{
    dword size = bmp_dgets(FILE_NAME, byte);
    FILE* fp = fopen(convert(FILE_NAME), "r");
    BYTE *PIX_ARRAY = malloc(size-54+1), *PIX_CUR = calloc(sizeof(RGB), sizeof(BYTE));
    dword readed, i, l;
    RGB color, prime_color;

    fseek(fp, 54, SEEK_SET); readed = fread(PIX_ARRAY, 1, size-54, fp);
    for(i = 54; i<size-54; i+=3)
    {
        color = bitfox_pixel_init(PIXEL_ARRAY[i], PIXEL_ARRAY[i+1], PIXEL_ARRAY[i+2);
        memmove(PIX_CUR, color, sizeof(RGB));
        for(l = 54; l<size-54; l+=3)
        {
            if (PIX_CUR[2] == PIXEL_ARRAY[l] && PIX_CUR[1] == PIXEL_ARRAY[l+1] && 
                PIX_CUR[0] == PIXEL_ARRAY[l+2])
                {

}

注意RGB是一个包含3个字节(R,G和B)的结构。 我知道那只不过......那就是我现在拥有的一切。 有什么方法可以完成这个吗?

1 个答案:

答案 0 :(得分:1)

如果你想要这样做 fast 就把一堆RAM扔掉(当然,如果有的话)。您可以使用带有RGB三重奏的大型直接查找表,将24位索引序列制作成连续的计数器阵列。在部分伪,部分代码中,类似这样:

// create a zero-filled 2^24 array of unsigned counters.
uint32_t *counts = calloc(256*256*256, sizeof(*counts));
uint32_t max_count = 0

// enumerate your buffer of RGB values, three bytes at a time:
unsigned char rgb[3];
while (getNextRGB(src, rgb)) // returns false when no more data.
{
    uint32_t idx = (((uint32_t)rgb[0]) << 16) | (((uint32_t)rgb[1]) << 8) | (uint32_t)rgb[2];
    if (++counts[idx] > max_count)
        max_count = idx;
}

R = (max_count >> 16) & 0xFF;
G = (max_count >> 8) & 0xFF;
B = max_count & 0xFF;

// free when you have no more images to process. for each new
//  image you can memset the buffer to zero and reset the max
//  for a fresh start.
free(counts);

多数民众赞成。如果你能负担得起这个a的大量内存(在这种情况下它将是64MB,每个条目4个字节,16.7M条目),那么执行此操作就变为O(N)。如果要处理一系列图像,只需将memset()数组重新设置为零,清除max_count,然后对每个其他文件重复。最后,完成后不要忘记释放你的记忆。

祝你好运。