Компьютерный форум NoWa.cc

Компьютерный форум NoWa.cc (https://nowa.cc/index.php)
-   Borland C++ Builder (https://nowa.cc/forumdisplay.php?f=301)
-   -   Уменьшение количества цветов в изображении (https://nowa.cc/showthread.php?t=392016)

Vashtanerada 18.04.2013 19:05

Уменьшение количества цветов в изображении
 
Здравствуйте! Пишу программу, которая преобразовывает изображение в схему для вышивки. Для этого изображение загружается в программу, разбивается на определенное количество равных квадратных ячеек (пользователь вводит количество необходимых ячеек по ширине изображения, и относительно этого программа разбивает все изображение). Затем в каждой ячейке определяется основной цвет, так чтобы в ячейке был только один цвет, результат выводится на экран. Дальше по задумке необходимо ограничить количество цветов на изображении (необходимое кол-во вводит пользователь) Вот тут то и возникает проблема: Если, скажем, пишем 3 цвета то это не совсем 3 цвета. У нас система RGB, и вот кол-во цветов получается не то число, которое вводит пользователь, а это число в третьей степени. Как-то так получается.

Работаю в Borland C++ builder
У меня это записано таким образом:

int TForm1::MyColors(int ccol, int cpix)
{
// ccol - кол-во цветов cpix - исходный цвет
int ar[255],ag[255],ab[255];
int clrs; // ступень цвета
int r,g,b,tmpc,q;
q=pow(ccol, 1/3);
clrs=255/q;
for (int i=1;i<=q;i++)
{ar[i]=clrs*i;}
ar[0]=0;ar[q+1]=255;
//*****
for (int i=0;i<=q;i++)
{tmpc=OneColor(cpix,'R');
if ((tmpc>=ar[i])&&(tmpc<=ar[i+1]))
{r=ar[i];break;}
}
for (int i=0;i<=q;i++)
{tmpc=OneColor(cpix,'G');
if ((tmpc>=ar[i])&&(tmpc<=ar[i+1]))
{g=ar[i];break;}
}
for (int i=0;i<=q;i++)
{tmpc=OneColor(cpix,'B');
if ((tmpc>=ar[i])&&(tmpc<=ar[i+1]))
{b=ar[i];break;}
}
//r=OneColor(cpix,'R')/ccol;
//g=OneColor(cpix,'G')/ccol;
//b=OneColor(cpix,'B')/ccol;
return FullColor(r,g,b);
}
Это как раз функция, которая должна выделить n-е кол-во цветов. Здесь я из введенного числа (кол-ва цветов) извлекаю кубический корень.

А здесь кусок программы, где эта функция используется:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int colcol=Edit2->Text.ToInt();
int inclr,outclr,r,g,b;
for (int x=1;x<Image2->Width;x++)
{for (int y=1;y<Image2->Height;y++)
{
inclr=Image2->Canvas->Pixels[x][y];
outclr=MyColors(colcol,inclr);
// r=OneColor(outclr,'R');
// g=OneColor(outclr,'G');
// b=OneColor(outclr,'B');
Image2->Canvas->Pixels[x][y]=outclr;
}
}
}

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


Текущее время: 12:17. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Copyright ©2004 - 2026 NoWa.cc

Время генерации страницы 0.02373 секунды с 9 запросами