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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2007, 20:32   #1
t3ns0r
Пользователь
 
Аватар для t3ns0r
 
Регистрация: 23.07.2007
Сообщений: 20
Вопрос Полупрозрачность - как?

Как реализовать полупрозрачность с BMP или PNG?
t3ns0r вне форума Ответить с цитированием
Старый 01.08.2007, 20:46   #2
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

Объясни более популярно, чего ты хочешь от программы
Alex21 вне форума Ответить с цитированием
Старый 01.08.2007, 20:58   #3
t3ns0r
Пользователь
 
Аватар для t3ns0r
 
Регистрация: 23.07.2007
Сообщений: 20
По умолчанию

Хочу сделать модуль для создания эффектов (взрывы, пламя и т.д.) по типу Parctile Illusion,
для этого полупрозрачность, имхо, необходима
t3ns0r вне форума Ответить с цитированием
Старый 01.08.2007, 21:26   #4
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

Код:
var Bitmap:TBitmap;
begin
Bitmap:=TBitmap.Create;
try
 with Bitmap do
  begin
    LoadFromFile('h:\123.bmp');
    Transparent:=true;
    TransparentColor:=Bitmap.Canvas.Pixels[10,10];
    transparentMode:=tmAuto;
{прозрачный цвет о умолчанию устанавливается в
clDefault = TColor($20000000)}
    Form1.Canvas.Draw(0,0,bitmap);
  end;
finally
 Bitmap.Free;
 end;
Думаю, пояснять не надо.
Alex21 вне форума Ответить с цитированием
Старый 01.08.2007, 22:08   #5
t3ns0r
Пользователь
 
Аватар для t3ns0r
 
Регистрация: 23.07.2007
Сообщений: 20
По умолчанию

Не в этом дело, я не знаю как использовать alpha канал изображения.
Мне нужно сделать так, чтобы одновременно было видно и изображение, и фон за ним, то есть сделать в некоторых местах изображение ПОЛУпрозрачным.
t3ns0r вне форума Ответить с цитированием
Старый 03.08.2007, 19:13   #6
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

а если перебирать все пиксели canvas.pixels[x,y], у первого цвет оставить, у второго - прозрачный, у третьего оставить, у четвертого - прозрачный, и т.д.
andrey4623 вне форума Ответить с цитированием
Старый 04.08.2007, 13:43   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

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

Код:
procedure BlendBitmap(Src, Dest: TBitmap; Amount: Byte; BackColor: TColor);
  function CandC(C1, C2: TRGBTriple): Boolean;
  begin {Сравнение двух цветов}
    Result := (C1.rgbtBlue = C2.rgbtBlue) and
      (C1.rgbtGreen = C2.rgbtGreen) and
      (C1.rgbtRed = C2.rgbtRed);
  end;
var
  x, y: Integer;
  ps, pd: pRGBTriple;
  rgb: TRGBTriple;
  A1, A2: Double;
begin
  if (Dest.Width > Src.Width) or (Dest.Height > Src.Height) then exit;
  Src.PixelFormat := pf24Bit;
  Dest.PixelFormat := pf24Bit;
  A1 := Amount / 255;
  A2 := 1 - A1;
  rgb.rgbtRed := Lo(BackColor);
  rgb.rgbtGreen := Lo(BackColor shr 8);
  rgb.rgbtBlue := Lo((BackColor shr 8) shr 8);
  for y := 0 to Src.Height-1 do
  begin
    ps := Src.ScanLine[y];
    pd := Dest.ScanLine[y];
    for x := 0 to Src.Width-1 do
    begin
      if not CandC(pd^, rgb) then
        with pd^ do
        begin
          rgbtBlue := Round(A1 * ps^.rgbtBlue + A2 * rgbtBlue);
          rgbtGreen := Round(A1 * ps^.rgbtGreen + A2 * rgbtGreen);
          rgbtRed := Round(A1 * ps^.rgbtRed + A2 * rgbtRed);
        end;
      Inc(pd);
      Inc(ps);
    end;
  end;
end;
работает на ура

смысл такой, ну а каждый пиксель на Api пербрать думаю не составит проблем если знаеш указатель на массив DIB
BOBAH13 вне форума Ответить с цитированием
Старый 06.08.2007, 22:10   #8
t3ns0r
Пользователь
 
Аватар для t3ns0r
 
Регистрация: 23.07.2007
Сообщений: 20
По умолчанию

to andrey4623
canvas.pixels[x,y] слишком медленный, если в цикле с ним больше 1000 повторений, FPS падает катастрофически.


to BOBAH13
Всё прекрасно работает и без тормозов, респект!
t3ns0r вне форума Ответить с цитированием
Старый 09.08.2007, 12:52   #9
ElenaA
Пользователь
 
Регистрация: 02.07.2007
Сообщений: 19
По умолчанию

Ребята, а можно как-нибудь, попроще, текст на картинку наложить? Текст формируется в проге, и нужно, чтобы фон был при этом виден.
ElenaA вне форума Ответить с цитированием
Старый 09.08.2007, 13:05   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Elena я правильно тебя понял, тебе это надо? :

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var tb:TBitmap;
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormPaint(Sender: TObject);
begin

Form1.Canvas.Draw(0,0, tb);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
tb:=TBitmap.Create;
tb.LoadFromFile('c:\мой файл.bmp');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
tb.Canvas.Brush.Style:=bsClear;
tb.Canvas.TextOut(100,100,Edit1.Tex t);

Repaint;
end;

end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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