Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.01.2013, 17:46
WVBR WVBR вне форума
Прохожий
 
Регистрация: 16.01.2013
Сообщения: 7
Репутация: 10
По умолчанию нанести на изображение полупрозрачный градиент

есть задача нанести на изображение полупрозрачный градиент с переходом от белого цвета с прозрачностью 50% до синего цвета с прозрачностью 5%

вот пример исходника процедуры, которая на image1 наносит градиент при попиксильном анализе, все бы ничего, но получается нанести только один цвет и без указания процентов, как добавить синий цвет и задать процент?


Код:
procedure TForm1.save1Click(Sender: TObject);
    procedure ImageGradient(bitmap: tbitmap; p:boolean);
type 
TRGB = record 
r: byte; 
g: byte; 
b: byte; 
end; 
ARGB = array[0..1]of TRGB; 
PARGB = ^ARGB; 
var 
pb, ps: PARGB; 
x,y,b:integer; 

function Min(a, b: Longint): Longint;
  begin
 if a > b then Result := b else  Result := a;
end; 

function convertByte(BaseColor: TColor; i:integer): TColor;
  begin
 if p=true then b:=Y else b:=x;
//RGB(A1-(A1-B1)/h*i, A2-(A2-B2)/h*i, A3-(A3-B3)/h*i);
Result := RGB(Min(GetRValue(ColorToRGB(BaseColor)) + round((255)*b/bitmap.Height), 255),
Min(GetGValue(ColorToRGB(BaseColor))+ round(255*b/bitmap.Height), 255),
Min(GetBValue(ColorToRGB(BaseColor))+ round(255*b/bitmap.Height), 255));
 end; 
  begin
bitmap.Assign(bitmap);
bitmap.PixelFormat:=pf24bit;

 for y:=0 to bitmap.Height-1 do
  begin
pb:=bitmap.scanline[y];
ps:=bitmap.scanline[y];
 for x:=0 to bitmap.Width-1 do
  begin
ps[x].r:=convertByte(pb[x].r,x);
ps[x].g:=convertByte(pb[x].g,x);
ps[x].b:=convertByte(pb[x].b,x)
end;

end;
end;
begin
     ImageGradient(Image1.Picture.Bitmap,false);
end;
Ответить с цитированием
  #2  
Старый 24.01.2013, 18:32
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

если установлен imagemagick то градиент
Код:
convert -size 200x200 gradient:'rgba(255,255,255,.5)'-'rgba(0,0,255,0.95)' gradient.png
нанести на другое тоже как-то можно
__________________
>woweook<

Последний раз редактировалось Pyro, 24.01.2013 в 18:49.
Ответить с цитированием
  #3  
Старый 24.01.2013, 22:02
WVBR WVBR вне форума
Прохожий
 
Регистрация: 16.01.2013
Сообщения: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
если установлен imagemagick то градиент
Код:
convert -size 200x200 gradient:'rgba(255,255,255,.5)'-'rgba(0,0,255,0.95)' gradient.png
нанести на другое тоже как-то можно

благодарю. а в каком исполнении этот imagemagick представлен ? как компонент ... или билиотека.. вот эта команда как из делфи запускается?
Ответить с цитированием
  #4  
Старый 25.01.2013, 07:26
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

как отдельная программа коммандной строки, запускать их из дельфи можно по-разному
__________________
>woweook<
Ответить с цитированием
  #5  
Старый 25.01.2013, 09:47
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

на GDI+ создать градиентную кисть:
Код:
function GdipCreateLineBrushFromRectI(rect: PGpRect; color1: ARGB; color2: ARGB;
  mode: LinearGradientMode; wrapMode: WarpMode; out lineGradient: GpLineGradient): GpStatus;
и залить область.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 26.01.2013, 17:07
WVBR WVBR вне форума
Прохожий
 
Регистрация: 16.01.2013
Сообщения: 7
Репутация: 10
По умолчанию

NumLock, благодарю за участие

я пробывл в интернете найти gdi+ компонент для делфи но не получилось этого сделатьь, я так понял это реализовано в неком юните который можно прекрепить в проэкт и использовать ту функцию которую вы озвучили. Я правильно понял ? мне нужно искать этот юнит с процедурами gdi+ ? или компонент
Ответить с цитированием
  #7  
Старый 27.01.2013, 11:23
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

http://zalil.ru/34208407
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 27.01.2013, 22:55
WVBR WVBR вне форума
Прохожий
 
Регистрация: 16.01.2013
Сообщения: 7
Репутация: 10
По умолчанию

NumLock благодарю

но всетаки решил проблему вот этим алгоритмом:

Код:
    procedure FillGradient(bt:tbitmap; ARect: TRect; StartColor, EndColor: TColor; StartAlpha, EndAlpha:byte; TopBottom:boolean);
    type TBitTArray = array[0..MaxInt div SizeOf(TRGBQuad)-1] of TRGBQuad;
    var
     rc1, rc2, gc1, gc2, bc1, bc2, ac1,ac2, _yy1,_yy2,y,x,_xx1,_xx2: Integer;
     rl1, rl2, gl1:integer; al:double;
     Brush: HBrush;  Row32:PRGBAArray; RowSet:TRGBQuad; RowSetP:^TRGBQuad;
     P: ^TBitTArray;
    begin
      rc1 := GetRValue(StartColor);
      gc1 := GetGValue(StartColor);
      bc1 := GetBValue(StartColor);
     
      rc2 := GetRValue(EndColor);
      gc2 := GetGValue(EndColor);
      bc2 := GetBValue(EndColor);
     
      if(ARect.Top<0) then ARect.Top:=0 else if(ARect.Top>bt.Height) then ARect.Top:=bt.Height;
      if(ARect.Left<0) then ARect.Left:=0 else if(ARect.Left>bt.Width) then ARect.Left:=bt.Width;
     
      _yy1:=0;
      _yy2:=ARect.Bottom-ARect.Top;
     
      _xx1:=0;
      _xx2:=ARect.Right-ARect.Left;
     
      if  TopBottom then begin
     
     
      for y:=_yy1 to _yy2-1 do begin
         Row32:= bt.ScanLine[y+ARect.Top];
     
         RowSet.rgbBlue:=(bc1 + (((bc2 - bc1) * (_yy1 + y)) div _yy2));
         Rowset.rgbGreen:=(gc1 + (((gc2 - gc1) * (_yy1 + y)) div _yy2));
         RowSet.rgbRed:=(rc1 + (((rc2 - rc1) * (_yy1 + y)) div _yy2));
     
         al:=((StartAlpha + (((EndAlpha - StartAlpha) * (_yy1 + y)) div _yy2)))/255;
     
         for x:=_xx1 to _xx2-1 do begin
            Row32[x+ARect.Left].rgbBlue:=round((1-al)*Row32[x+ARect.Left].rgbBlue+al*RowSet.rgbBlue);
            Row32[x+ARect.Left].rgbGreen:=round((1-al)*Row32[x+ARect.Left].rgbGreen+al*RowSet.rgbGreen);
            Row32[x+ARect.Left].rgbRed:=round((1-al)*Row32[x+ARect.Left].rgbRed+al*RowSet.rgbRed);
         end;
     
      end;
     
      end else begin
     
         P:=AllocMem(_xx2 * SizeOf(TRGBQuad));
         try
     
     
            RowSetP:=Pointer(@P^[0]);
            for x:=_xx1 to _xx2-1 do begin
                RowSetP.rgbRed:=(rc1 + (((rc2 - rc1) * (ARect.Left + x)) div ARect.Right));
                RowSetP.rgbGreen:=(gc1 + (((gc2 - gc1) * (ARect.Left + x)) div ARect.Right));
                RowSetP.rgbBlue:=(bc1 + (((bc2 - bc1) * (ARect.Left + x)) div ARect.Right));
                RowSetP.rgbReserved:=((StartAlpha + (((EndAlpha - StartAlpha) * (_xx1 + x)) div _xx2)));
                inc(RowSetP);
            end;
     
     
            for y:=_yy1 to _yy2-1 do begin
                Row32:= bt.ScanLine[y+ARect.Top];
     
                RowSetP:=Pointer(@P^[0]);
                for x:=_xx1 to _xx2-1 do begin
                    al:=RowSetP.rgbReserved/255;
     
                    Row32[x+ARect.Left].rgbBlue:=round((1-al)*Row32[x+ARect.Left].rgbBlue+al*RowSetP.rgbBlue);
                    Row32[x+ARect.Left].rgbGreen:=round((1-al)*Row32[x+ARect.Left].rgbGreen+al*RowSetP.rgbGreen);
                    Row32[x+ARect.Left].rgbRed:=round((1-al)*Row32[x+ARect.Left].rgbRed+al*RowSetP.rgbRed);
     
                    inc(RowSetP);
               end;
     
            end;
     
         finally
            FreeMem(P, _xx2*SizeOf(TRGBQuad));
         end;
     
     
      end;
    end;
Изображения
Тип файла: jpg Безымянный1.jpg (69.6 Кбайт, 17 просмотров)
Ответить с цитированием
  #9  
Старый 28.01.2013, 12:19
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
procedure FillGradientBrush(ABitmap: TBitmap; ARect: TRect; StartColor, EndColor: DWORD);
var
  FBrush: TGPLinearGradientBrush;
  FGraphics: TGPGraphics;
begin
  FBrush:=TGPLinearGradientBrush.Create(MakeRect(ARect), StartColor, EndColor, LinearGradientModeHorizontal);
  FGraphics:=TGPGraphics.Create(ABitmap.Canvas.Handle);
  FGraphics.FillRectangle(FBrush, MakeRect(ARect));
  FGraphics.Free;
  FBrush.Free;
end;

begin
  FillGradientBrush(Image1.Picture.Bitmap, Image1.ClientRect, $80ff0000, $8000ff00);
end;

__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:51.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter