Последние записи
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage
- Удаление папки с файлами
- Распечатка файла
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
8th
Апр
GDI\GDI+\Photoshop — как добиться прозрачности пикселей определенного цвета?
Posted by obzor under Delphi, Photoshop
Очень хотелось бы отрисовать у себя в проекте круговую диаграмму в виде «бублика», видел красивые примеры у Касперского, и некоторых других.
Добился определенного успеха в этом деле:
Полный код, чтобы не загружать тему:
http://pastebin.com/SVnT0bww
Здесь зеленый цвет рисуется специально, в надежде как-то его потом убрать. Но не выходит.
Максимум, чего пока удалось добиться, это включение прозрачности у битмапа и указание прозрачного цвета. Но, даже при этом, убирается не вся «зелень» + жуткая лесенка по краям.
От чего я ушел на GDI+, при рисовании секторов.
Вот другие варианты.
Старый вариант, лесенка везде:
Вариант поновее, но убирается только внешние цвета и имеется лесенка.
Есть вариант
Как-то использовать маску, заранее нарисованную в фотошопе,
Но так и не понял, как ее приспособить…
Использую Delphi XE
Когда-то ковырялся в этом, во примерчики выложил
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;
Побыстрому разноцветное кольцо набросал. А вот как сделать 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;
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)