好吧..根据标题,我试图找出一种方法 - 返回在字符串中占主导地位的字符的函数。我或许可以弄清楚..但是我的逻辑看起来有些不对劲而且我在这方面失败了。如果有人能够毫无问题地提出这个问题,我将非常高兴地感谢你。
我说"在一个字符串"使它更简化。我实际上是从包含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)的结构。
我知道那只不过......那就是我现在拥有的一切。
有什么方法可以完成这个吗?
答案 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
,然后对每个其他文件重复。最后,完成后不要忘记释放你的记忆。
祝你好运。