Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2014, 19:02   #1
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
Вопрос GDI\GDI+\Photoshop - как добиться прозрачности пикселей определенного цвета?

Приветствую!

Очень хотелось бы отрисовать у себя в проекте круговую диаграмму в виде "бублика", видел красивые примеры у Касперского, и некоторых других.

Добился определенного успеха в этом деле:


Полный код, чтобы не загружать тему:
http://pastebin.com/SVnT0bww

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

Максимум, чего пока удалось добиться, это включение прозрачности у битмапа и указание прозрачного цвета. Но, даже при этом, убирается не вся "зелень" + жуткая лесенка по краям.
От чего я ушел на GDI+, при рисовании секторов.

Вот другие варианты.
Старый вариант, лесенка везде:


Вариант поновее, но убирается только внешние цвета и имеется лесенка.


Есть вариант
Как-то использовать маску, заранее нарисованную в фотошопе,

Но так и не понял, как ее приспособить...

Использую Delphi XE
STRELOK-2007 вне форума Ответить с цитированием
Старый 08.01.2014, 10:48   #2
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
По умолчанию

Неужели это такой сложный вопрос?
STRELOK-2007 вне форума Ответить с цитированием
Старый 08.01.2014, 11:23   #3
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

как убирают эти "лесенки"? применяется размытие или сведение цветов (компромисс двух цветов)
ZuBy вне форума Ответить с цитированием
Старый 08.01.2014, 11:27   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

http://msdn.microsoft.com/ru-ru/libr...vs.110%29.aspx
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.01.2014, 12:22   #5
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Да, это GDI+.
Это я и применяю для рисования непосредственно диаграммы. НО, как сделать примерно то-же самое по краям и в центре с прозрачными пикселями?
STRELOK-2007 вне форума Ответить с цитированием
Старый 08.01.2014, 22:17   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

А зачем вообще рисовать этот зеленый цвет? Вы можете сразу нарисовать только то, что нужно, и там, где нужно?
Может быть неправ
(рисовал только пару вещей:
http://programmersforum.ru/showpost....08&postcount=9,
http://programmersforum.ru/showpost....3&postcount=17,
http://programmersforum.ru/showpost....60&postcount=4
).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.01.2014, 22:55   #7
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
А зачем вообще рисовать этот зеленый цвет? Вы можете сразу нарисовать только то, что нужно, и там, где нужно?
Может быть неправ
(рисовал только пару вещей:
http://programmersforum.ru/showpost....08&postcount=9,
http://programmersforum.ru/showpost....3&postcount=17,
http://programmersforum.ru/showpost....60&postcount=4
).
Огромнейшее спасибо! Обязательно изучу примеры. А есть ли еще что-то подобное?
STRELOK-2007 вне форума Ответить с цитированием
Старый 09.01.2014, 02:38   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Пожалуйста. Осторожно с примерами - писались на коленке, первый раз видя gdi+
Быстрый поиск по форуму не принес результатов, но Вы можете попробовать поискать сами (может быть повезет больше).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.01.2014, 10:48   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Когда-то ковырялся в этом, во примерчики выложил
Код:
function ColorToARGBProc(Color: TColor; Proc: Word = 0): ARGB;
var xColor: Cardinal;
    xProc,xHue,xLuminance,xSaturation: Word;
begin
  xColor:=ColorToRGB(Color);
  if Proc>100 then xProc:=100 else xProc:=Proc;
  if xProc>0 then begin
    ColorRGBToHLS(xColor,xHue,xLuminance,xSaturation);
    xLuminance:=xLuminance+Round((240-xLuminance)/100*xProc);
    if xLuminance>240 then xLuminance:=240;
    xColor:=ColorHLSToRGB(xHue,xLuminance,xSaturation);
  end;
  Result:=MakeColor(GetRValue(xColor),GetGValue(xColor),GetBValue(xColor));
end;

function ColorToRGBProc(Color: TColor; Proc: Word = 0): Cardinal;
var xColor: Cardinal;
    xProc,xHue,xLuminance,xSaturation: Word;
begin
  xColor:=ColorToRGB(Color);
  if Proc>100 then xProc:=100 else xProc:=Proc;
  if xProc>0 then begin
    ColorRGBToHLS(xColor,xHue,xLuminance,xSaturation);
    xLuminance:=xLuminance+Round((240-xLuminance)/100*xProc);
    if xLuminance>240 then xLuminance:=240;
    xColor:=ColorHLSToRGB(xHue,xLuminance,xSaturation);
  end;
  Result:=xColor;
end;

procedure TForm1.Button2Click(Sender: TObject);
var GPGraphics,GPGraphicsBuf: TGPGraphics;
    GPBitmapBuf: TGPBitmap;
    GPLinearGradientBrush: TGPLinearGradientBrush;
    GPPathGradientBrush: TGPPathGradientBrush;
    GPSolidBrush: TGPSolidBrush;
    GPGraphicsPath: TGPGraphicsPath;
    xColorRGB: Cardinal;
    xARGB: ARGB;
    xCount: Integer;
begin
  {Градиентный фон формы}
  GPGraphics:=TGPGraphics.Create(Canvas.Handle);
  GPBitmapBuf:=TGPBitmap.Create(ClientWidth,ClientHeight,GPGraphics);
  GPGraphicsBuf:=TGPGraphics.Create(GPBitmapBuf); //для двойной буфферизации
  xColorRGB:=ColorToRGBProc(clGreen);
  GPLinearGradientBrush:=TGPLinearGradientBrush.Create(MakePoint(0,ClientHeight div 2),MakePoint(0,0),ColorToARGBProc(xColorRGB),ColorToARGBProc(xColorRGB,80));
  GPGraphicsBuf.FillRectangle(GPLinearGradientBrush,0,0,Width,Height div 2);
  GPLinearGradientBrush.Free;
  GPLinearGradientBrush:=TGPLinearGradientBrush.Create(MakePoint(0,ClientHeight div 2-1),MakePoint(0,ClientHeight),ColorToARGBProc(xColorRGB),ColorToARGBProc(xColorRGB,80));
  GPGraphicsBuf.FillRectangle(GPLinearGradientBrush,0,ClientHeight div 2,ClientWidth,ClientHeight);
  GPLinearGradientBrush.Free;
  GPGraphics.DrawImage(GPBitmapBuf,0,0,0,0,Width,Height,UnitPixel);
  GPGraphicsBuf.Free;
  GPBitmapBuf.Free;
  GPGraphics.Free;

  {Крашенный круг}
  GPGraphics:=TGPGraphics.Create(Canvas.Handle);
  GPBitmapBuf:=TGPBitmap.Create(400,400,GPGraphics);
  GPGraphicsBuf:=TGPGraphics.Create(GPBitmapBuf); //для двойной буфферизации
  GPGraphicsBuf.SetSmoothingMode(SmoothingModeAntiAlias);
  xColorRGB:=ColorToRGBProc(clRed);
  GPSolidBrush:=TGPSolidBrush.Create(ColorToARGBProc(xColorRGB));
  GPGraphicsBuf.FillEllipse(GPSolidBrush,0,0,400-1,400-1);
  GPSolidBrush.Free;
  GPGraphics.DrawImage(GPBitmapBuf,20,20,0,0,400,400,UnitPixel);
  GPGraphicsBuf.Free;
  GPBitmapBuf.Free;
  GPGraphics.Free;

  {Крашенный градиентный вложенный круг}
  GPGraphics:=TGPGraphics.Create(Canvas.Handle);
  GPBitmapBuf:=TGPBitmap.Create(200,200,GPGraphics);
  GPGraphicsBuf:=TGPGraphics.Create(GPBitmapBuf); //для двойной буфферизации
  GPGraphicsBuf.SetSmoothingMode(SmoothingModeAntiAlias);
  xColorRGB:=ColorToRGBProc(clBlue);
  GPGraphicsPath:=TGPGraphicsPath.Create;
  GPGraphicsPath.AddEllipse(0,0,200,200);
  GPPathGradientBrush:=TGPPathGradientBrush.Create(GPGraphicsPath);
  GPPathGradientBrush.SetCenterColor(ColorToARGBProc(xColorRGB));
  xARGB:=ColorToARGBProc(xColorRGB,70);
  xCount:=1;
  GPPathGradientBrush.SetSurroundColors(@xARGB,xCount);
  GPGraphicsBuf.FillEllipse(GPPathGradientBrush,0,0,200-1,200-1);
  GPPathGradientBrush.Free;
  GPGraphicsPath.Free;
  GPGraphics.DrawImage(GPBitmapBuf,120,120,0,0,200,200,UnitPixel);
  GPGraphicsBuf.Free;
  GPBitmapBuf.Free;
  GPGraphics.Free;
end;
А это просто кольцо с выравниванием границы
Код:
procedure TForm1.Button3Click(Sender: TObject);
var GPGraphics: TGPGraphics;
    GPGraphicsPath: TGPGraphicsPath;
    GPSolidBrush: TGPSolidBrush;
begin
  GPGraphics:=TGPGraphics.Create(Canvas.Handle);
  GPGraphics.SetSmoothingMode(SmoothingModeAntiAlias);
  GPGraphicsPath:=TGPGraphicsPath.Create;
  GPGraphicsPath.AddEllipse(10,10,300,300);
  GPGraphicsPath.AddEllipse(90,90,140,140);
  GPSolidBrush:=TGPSolidBrush.Create(ColorToARGBProc(ColorToRGBProc(clBlue)));
  GPGraphics.FillPath(GPSolidBrush,GPGraphicsPath);
  GPSolidBrush.Free;
  GPGraphicsPath.Free;
  GPGraphics.Free;
end;
Изображения
Тип файла: jpg Безымянный.JPG (19.8 Кб, 162 просмотров)
Тип файла: jpg Безымянный1.JPG (14.9 Кб, 167 просмотров)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.01.2014 в 14:23.
Аватар вне форума Ответить с цитированием
Старый 09.01.2014, 19:58   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Побыстрому разноцветное кольцо набросал. А вот как сделать 3d-границу не пробовал
Код:
procedure TForm1.Button3Click(Sender: TObject);
var GPGraphics: TGPGraphics;
    GPGraphicsPath: TGPGraphicsPath;
    GPSolidBrush: TGPSolidBrush;
begin
  GPGraphics:=TGPGraphics.Create(Canvas.Handle);
  GPGraphics.SetSmoothingMode(SmoothingModeAntiAlias);

  GPGraphicsPath:=TGPGraphicsPath.Create;
  GPSolidBrush:=TGPSolidBrush.Create(ColorToARGBProc(ColorToRGBProc(clRed)));
  GPGraphicsPath.AddPie(10,10,300,300,0,90);
  GPGraphicsPath.AddPie(90,90,140,140,0,90);
  GPGraphics.FillPath(GPSolidBrush,GPGraphicsPath);
  GPSolidBrush.Free;
  GPGraphicsPath.Free;

  GPGraphicsPath:=TGPGraphicsPath.Create;
  GPSolidBrush:=TGPSolidBrush.Create(ColorToARGBProc(ColorToRGBProc(clGreen)));
  GPGraphicsPath.AddPie(10,10,300,300,90,45);
  GPGraphicsPath.AddPie(90,90,140,140,90,45);
  GPGraphics.FillPath(GPSolidBrush,GPGraphicsPath);
  GPSolidBrush.Free;
  GPGraphicsPath.Free;

  GPGraphicsPath:=TGPGraphicsPath.Create;
  GPSolidBrush:=TGPSolidBrush.Create(ColorToARGBProc(ColorToRGBProc(clBlue)));
  GPGraphicsPath.AddPie(10,10,300,300,135,100);
  GPGraphicsPath.AddPie(90,90,140,140,135,100);
  GPGraphics.FillPath(GPSolidBrush,GPGraphicsPath);
  GPSolidBrush.Free;
  GPGraphicsPath.Free;

  GPGraphicsPath:=TGPGraphicsPath.Create;
  GPSolidBrush:=TGPSolidBrush.Create(ColorToARGBProc(ColorToRGBProc(clYellow)));
  GPGraphicsPath.AddPie(10,10,300,300,235,55);
  GPGraphicsPath.AddPie(90,90,140,140,235,55);
  GPGraphics.FillPath(GPSolidBrush,GPGraphicsPath);
  GPSolidBrush.Free;
  GPGraphicsPath.Free;

  GPGraphicsPath:=TGPGraphicsPath.Create;
  GPSolidBrush:=TGPSolidBrush.Create(ColorToARGBProc(ColorToRGBProc(clPurple)));
  GPGraphicsPath.AddPie(10,10,300,300,290,70);
  GPGraphicsPath.AddPie(90,90,140,140,290,70);
  GPGraphics.FillPath(GPSolidBrush,GPGraphicsPath);
  GPSolidBrush.Free;
  GPGraphicsPath.Free;

  GPGraphics.Free;
end;
Изображения
Тип файла: jpg Безымянный.jpg (32.4 Кб, 163 просмотров)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
GDI как пользоваться Madmaxisss Visual C++ 3 14.12.2011 18:09
сколько пикселей определенного цвета на изображении nastyaa Общие вопросы Delphi 1 08.09.2011 20:59
Количество пикселей определенного цвета zih Общие вопросы Delphi 4 20.10.2010 23:57
AutoIt Подсчет кол-ва пикселей определенного цвета в определенной области активного окна z3xix13 Помощь студентам 0 02.10.2010 14:27
Как подключить GDI+ в code::blocks AxenicX Общие вопросы C/C++ 8 27.12.2009 13:12