Помощь - Поиск - Пользователи - Календарь
Полная версия: Закрасить картинку на С++Builder
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
Child of Bodom
Люди поможите еще раз? в общем в билдере 6 работаю вот. Вот и надо допустим открыл рисунок в Image . Вот и надо чтоб он из центра закрашивался по пикселям.Причем надо сделать чтобы можно было выбирать цвет закраски. Я почти зделал эту прогу , и она работает как надо но только с черным цветом. А надо чтоб выбрал цвет , и этим цветом закрасилось.

void __fastcall TForm1::open1Click(TObject *Sender)
{
vibor->Execute();        // выбираем файл 
Image->Picture->LoadFromFile(vibor->FileName);
Image->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::fillClick(TObject *Sender)
{
ColorDialog->Execute();
d=1;
x=(Image->Width)/2;
y=(Image->Height)/2;
Image1->Canvas->Pixels[x][y]=ColorDialog->Color;
Timer->Enabled=true;
Image1->Canvas->CopyMode=cmSrcAnd;    // включаем режим наложения
Image1->Canvas->CopyRect(Rect(0,0,Image1->Width,Image1->Height),Image->Canvas,Rect(0,0,Image->Width,Image->Height));

}
//---------------------------------------------------------------------------
// в Image - рисунок, кот.надо закрасить  image1- на нем рисуем по пиксельно 
void __fastcall TForm1::TimerTimer(TObject *Sender)
{
  for (i=1;i<=d;i++)
   {
     y++;
     if (x==0) Timer->Enabled=false;
     Image1->Canvas->Pixels[x][y]=ColorDialog->Color;
   }
   Image1->Canvas->CopyMode=cmSrcAnd;
   Image1->Canvas->CopyRect(Rect(0,0,Image1->Width,Image1->Height),Image->Canvas,Rect(0,0,Image->Width,Image->Height));

   for (i=1;i<=d;i++)
   {
     x++;
     Image1->Canvas->Pixels[x][y]=ColorDialog->Color;
   }
   d++;
   for (i=1;i<=d;i++)
   {
     y--;
     Image1->Canvas->Pixels[x][y]=ColorDialog->Color;
   }
   for (i=1;i<=d;i++)
   {
     x--;
     Image1->Canvas->Pixels[x][y]=ColorDialog->Color;
   }
   d++;
}
 


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

(Препод достал уже все ему переделывать надо)
volvo
Цитата
получается если выбрать любой другой цвет , то получиться как будто цветной фильтр, иными словами если посмореть на голубое небо через красное стекло.
Присоедини свой проект (вместе с рисунком). Я только что попробовал сделать так, как ты показываешь - никакого "эффекта прозрачности" нет близко, все закрашивается сплошным цветом...
Child of Bodom
Вот все равно получается фото фильтр
volvo
А чего ты сразу не грузишь изображение в Image1->Picture, и в нем напрямую не закрашиваешь пиксели? Зачем этот промежуточный Image?
Child of Bodom
Цитата(volvo @ 24.12.2007 19:09) *

А чего ты сразу не грузишь изображение в Image1->Picture, и в нем напрямую не закрашиваешь пиксели? Зачем этот промежуточный Image?


Да не Image на нем открытый файл , а на Image1 я рисую пиксели потом их совмещаю
а я так пробовал(все на одном делать) получалось что вместо открытого рисунка создавался как бы новый белый фон и на нем рисовались пиксели
volvo
Цитата
Да не Image на нем открытый файл , а на Image1 я рисую пиксели потом их совмещаю

А вот я тебя и спрашиваю, ЗАЧЕМ??? Что, сначала создаешь себе препятствия, а потом их с успехом преодолеваешь? Так вот не очень-то преодолевается, как видно... Зачем морочить голову себе с ДВУМЯ картинками и постоянным копированием с одной на другую, если то же самое можно сделать простым заполнением пикселей на одной и той же картинке? Ведь все совершенно просто:

void __fastcall TForm1::open1Click(TObject *Sender)
{
	if(vibor->Execute()) {
		Image1->Picture->LoadFromFile(vibor->FileName);
		Image1->Enabled=true;
	}
}

//---------------------------------------------------------------------------
void __fastcall TForm1::fillClick(TObject *Sender)
{
	if(ColorD->Execute()) {
		d = 1;
		x = (Image1->Width)/2;
		y = (Image1->Height)/2;
		Image1->Canvas->Pixels[x][y]=ColorD->Color;
		Timer->Enabled = true;
	}

}

//---------------------------------------------------------------------------
void __fastcall TForm1::TimerTimer(TObject *Sender)
{
  for(i = 1; i <= d; i++) {
	 if(!x) Timer->Enabled = false;
	 Image1->Canvas->Pixels[x][++y]=ColorD->Color;
   }

   for(i = 1;i <= d; i++) {
	 Image1->Canvas->Pixels[++x][y]=ColorD->Color;
   }
   d++;
   for(i = 1;i <= d; i++) {
	 Image1->Canvas->Pixels[x][--y]=ColorD->Color;
   }
   for(i = 1;i <= d; i++) {
	 Image1->Canvas->Pixels[--x][y]=ColorD->Color;
   }
   d++;
}

Что работает не так?
Child of Bodom
или я дибил или просто устал от учебы . странно я с самого начала(когда первый раз писал ее ) пробовал так у меня появлялся белый фон и на нем рисовалось. Вот я тупой smile.gif

Спасибо за помощь give_rose.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.