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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2010, 20:06   #1
sergeyrulit
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 53
По умолчанию Наложить BMP на BMP.

Нужно наложить один BMP на другой с прозрачностью. Допустим в первом BMP скрин рабочего стола, а во втором просто белый фон. После наложения получается как бы осветленный на 50% скрин.

Я погуглил, нашел:

Код:
procedure VerbindenBmp;
var
  BmpConverte1, BmpConverte2: TBitMap;
  Blend: TBlendFunction;
begin
  BmpConverte1 := TBitMap.Create;
  BmpConverte1.LoadFromFile('2.bmp');
  BmpConverte2 := TBitMap.Create;
  BmpConverte2.LoadFromFile('1.bmp');

  Blend.SourceConstantAlpha := 130;
  if Windows.AlphaBlend(BmpConverte1.Canvas.Handle, 0, 0, BmpConverte1.Width,
    BmpConverte1.Height, BmpConverte2.Canvas.Handle, 0, 0, BmpConverte2.Width,
      BmpConverte2.Height, Blend) then Form1.Image1.Canvas.Draw(0, 0, BmpConverte1);

  BmpConverte1.Free;
  BmpConverte2.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  VerbindenBmp;
end;
Работает, но если сделать так:

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
    VerbindenBmp;
end;
То, не работает!. Мне не нужно при FormPaint, нужно при Button1Click...
sergeyrulit вне форума Ответить с цитированием
Старый 18.11.2010, 20:25   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Как смешать две картинки
Код:
procedure TacSpeedButton.Morphing(Bm1, Bm2: TBitmap; Progress: Integer);
var
  dstPixel, srcPixel: PRGBQuad;
  Weight: Integer;
  I: Integer;
begin
  if (Assigned(Bm1) and Assigned(Bm2)) then
  begin
    Bm1.PixelFormat := pf32bit;
    Bm2.PixelFormat := pf32bit;
    srcPixel := Bm2.ScanLine[Bm2.Height – 1];
    dstPixel := Bm1.ScanLine[Bm1.Height – 1];
    Weight := MulDiv(256, Progress, 100);
    for I := (Bm1.Width * Bm1.Height) – 1 downto 0 do
    begin
      with dstPixel^ do
      begin
        Inc(rgbRed, (Weight * (srcPixel^.rgbRed – rgbRed)) shr 8);
        Inc(rgbGreen, (Weight * (srcPixel^.rgbGreen – rgbGreen)) shr 8);
        Inc(rgbBlue, (Weight * (srcPixel^.rgbBlue – rgbBlue)) shr 8);
      end;
      Inc(srcPixel);
      Inc(dstPixel);
    end;
  end;
end;
http://www.programmersclub.ru/Как-смешать-две-картинки/


Вот еще вариант :
Код:
procedure MixBMP(BM1, BM2: TBitMap; var BM: TBitMap);
var
  I, J: Integer;
  MinW, MinH: Integer;
begin
  BM := TBitMap.Create;
  if BM1.Width < BM2.Width then
    MinW := BM1.Width
  else
    MinW := BM2.Width;
  if BM1.Height < BM2.Height then
    MinH := BM1.Height
  else
    MinH := BM2.Height;
  BM.Width := MinW;
  BM.Height := MinH;
  for I := 0 to MinW do
    for J := 0 to MinH do
      if (Odd(I) and Odd(J)) or ((not (Odd(I))) and (not (Odd(J)))) then
        BM.Canvas.Pixels[I, J] := BM1.Canvas.Pixels[I, J]
      else
        BM.Canvas.Pixels[I, J] := BM2.Canvas.Pixels[I, J];
end;
З.Ы. Коды не мои, так что разбирайтесь сами.

Последний раз редактировалось mihali4; 18.11.2010 в 20:38.
mihali4 вне форума Ответить с цитированием
Старый 19.11.2010, 13:45   #3
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

а если заполнить структуру TBlendFunction?
Код:
  Blend.BlendOp:=AC_SRC_OVER;
  Blend.BlendFlags:=0;
  Blend.SourceConstantAlpha:=130;
  Blend.AlphaFormat:=0;
x128 вне форума Ответить с цитированием
Старый 19.11.2010, 21:31   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Мне не нужно при FormPaint, нужно при Button1Click...
То, что можно сделать в Paint, можно и с кнопки. Это не может быть причиной.

Структура с опциями прозрачности в том примере действительно заполнена не полностью.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 19.11.2010, 21:50   #5
sergeyrulit
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 53
По умолчанию

Да спасибо, утром это и сам понял. Теперь норм.
sergeyrulit вне форума Ответить с цитированием
Старый 03.03.2015, 16:18   #6
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Цитата:
Сообщение от sergeyrulit Посмотреть сообщение
это и сам понял
Сам понял, покажи другому. Я не понял. В какую переменную вводить: C:\Program Files\Delphi7\Delphi7\Projects\15.м есяц03.01\a10.bmp и
C:\Program Files\Delphi7\Delphi7\Projects\15.м есяц03.01\Fon8.bmp ?
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 05.03.2015, 13:41   #7
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Пока использую:
Код:
var
  Form1: TForm1;
  x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,x7,y7,x8,y8,x9,y9:integer;
  fon: String; //файл изображения фона
  bmp2, bmp3, bmp4, bmp5, bmp6, bmp7, bmp8, bmp9: String; //файлы налагаемых изменений на белом фоне
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 fon:= 'fon.bmp';
 bmp2:= 'avto.bmp';
 bmp3:= 'moto.bmp';
 bmp4:='(None).bmp';
 bmp5:= '(None).bmp';
 bmp6:='(None).bmp';
 bmp7:= '(None).bmp';
 bmp8:='(None).bmp';
 bmp9:= '(None).bmp';
 Image1.Picture.LoadFromFile(fon) ; // не изменяемый фон

 Image2.Picture.LoadFromFile(bmp2) ; //
 Image3.Picture.LoadFromFile(bmp3) ; //
 Image4.Picture.LoadFromFile(bmp2) ; //
 Image6.Picture.LoadFromFile(bmp3) ; //
 Image7.Picture.LoadFromFile(bmp2) ; //
 Image8.Picture.LoadFromFile(bmp3) ; //
 Image9.Picture.LoadFromFile(bmp2) ; //
 Image1.Transparent:=False; // Фон не прозрачен
 Image2.Transparent:=True; //прозрачность у налагаемого изображения
 Image3.Transparent:=True; //прозрачность у налагаемого изображения
 Image4.Transparent:=True; //прозрачность у налагаемого изображения
 Image5.Transparent:=True; //прозрачность у налагаемого изображения
 Image6.Transparent:=True; //прозрачность у налагаемого изображения
 Image7.Transparent:=True; //прозрачность у налагаемого изображения
 Image8.Transparent:=True; //прозрачность у налагаемого изображения
 Image9.Transparent:=True; //прозрачность у налагаемого изображения
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  x2:=200;//
  x3:=150;//
  x4:=250;//
  x5:=190;//
 //рисуем
 Image2.Left:=x2;
 Image3.Left:=x3;
 Image4.Left:=x2;
 Image5.Left:=x3;
end;
Репутация: полный "0"

Последний раз редактировалось zvygin1964; 05.03.2015 в 13:43.
zvygin1964 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка BMP в Simple Graph и сохранение в BMP формат artemavd Общие вопросы Delphi 10 02.10.2010 14:19
BMP в массив fen1ksss Мультимедиа в Delphi 21 21.09.2010 01:22
bmp картинка waka2ebawer Общие вопросы Delphi 7 29.07.2010 21:29
bmp картинки B@R@B@$HK@ Общие вопросы C/C++ 0 09.06.2009 23:08
Декодирование BMP Rezet Мультимедиа в Delphi 6 24.01.2009 22:33