Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.09;
Скачать: CL | DM;

Вниз

Как скопировать из одного Bitmap в другой?   Найти похожие ветки 

 
Arazel/NikNet   (2005-10-25 20:30) [0]

Как скопировать из одного Bitmap в другой?

Проблема такая:
Есть Bitmap, на  котором загружено изображения
изображение состоит из  трех картинок, которые
должны меняться во время работы программы

второй Bitmap не имеет не какого изображение
вот в  него и должна загружаться одна из картинок

Суть вопроса таков:
Как мне из первого Bitmap(а) загружать одну
картинку, которая по размерам 23x26 (каждая)
в  другой, что  бы затем отобразить его?

Я пробиваю так, но не чего не получается:

        TmpBmp.Canvas.CopyRect(
         rect(0,0,23,26),
         ImgBtns.Canvas,
         Rect(0,0,23,26));


 
Arazel/NikNet   (2005-10-25 20:31) [1]

Если  можно с прозрачностью...


 
Antonn ©   (2005-10-26 05:37) [2]

Arazel/NikNet   (25.10.05 20:31) [1]
попробуй одну из процедур из этого модуля:
http://kladovka.net.ru/index.cgi?pid=list&rid=252


 
Gydvin ©   (2005-10-26 13:43) [3]

Bitblt


 
Antonn ©   (2005-10-26 14:19) [4]

Gydvin ©   (26.10.05 13:43) [3]
Bitblt

а что, это с прозрачностью может копировать?


 
Gydvin ©   (2005-10-26 14:49) [5]

Antonn ©   (26.10.05 14:19) [4]

сам по себе нет, а вот если скомбинировать его вот с этим, то да, покрайнемре я гибрид делал, если надо сегодня вечером опубликую.

procedure DrawTransparentBmp(Cnv: TCanvas; x,y: Integer; Bmp: TBitmap; clTransparent: TColor);
var
 bmpXOR, bmpAND, bmpINVAND, bmpTarget: TBitmap;
 oldcol: Longint;
begin
 try
   bmpAND := TBitmap.Create;
   bmpAND.Width := Bmp.Width;
   bmpAND.Height := Bmp.Height;
   bmpAND.Monochrome := True;
   oldcol := SetBkColor(Bmp.Canvas.Handle, ColorToRGB(clTransparent));
   BitBlt(bmpAND.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, Bmp.Canvas.Handle, 0, 0, SRCCOPY);
   SetBkColor(Bmp.Canvas.Handle, oldcol);

   bmpINVAND := TBitmap.Create;
   bmpINVAND.Width := Bmp.Width;
   bmpINVAND.Height := Bmp.Height;
   bmpINVAND.Monochrome := True;
   BitBlt(bmpINVAND.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, bmpAND.Canvas.Handle, 0, 0, NOTSRCCOPY);

   bmpXOR := TBitmap.Create;
   bmpXOR.Width := Bmp.Width;
   bmpXOR.Height := Bmp.Height;
   BitBlt(bmpXOR.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, Bmp.Canvas.Handle, 0, 0, SRCCOPY);
   BitBlt(bmpXOR.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, bmpINVAND.Canvas.Handle, 0, 0, SRCAND);

   bmpTarget := TBitmap.Create;
   bmpTarget.Width := Bmp.Width;
   bmpTarget.Height := Bmp.Height;
   BitBlt(bmpTarget.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, Cnv.Handle, x, y, SRCCOPY);
   BitBlt(bmpTarget.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, bmpAND.Canvas.Handle, 0, 0, SRCAND);
   BitBlt(bmpTarget.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, bmpXOR.Canvas.Handle, 0, 0, SRCINVERT);
   BitBlt(Cnv.Handle, x, y, Bmp.Width, Bmp.Height, bmpTarget.Canvas.Handle, 0, 0, SRCCOPY);
 finally
   bmpXOR.Free;
   bmpAND.Free;
   bmpINVAND.Free;
   bmpTarget.Free;
 end;
end;



 
Gydvin ©   (2005-10-26 14:55) [6]

Просто под рукой этого кода нет.
Там все также, как в Bitblt,  только можно задавать еще и цвет фона из которого эта функция будет картинку вырезать.


 
Antonn ©   (2005-10-26 15:35) [7]

Gydvin ©   (26.10.05 14:49) [5]
ого, внушает:) через scanline на порядок быстрее(чуть больше, чем на порядок):)
Gydvin ©   (26.10.05 14:55) [6]
Там все также, как в Bitblt,  только можно задавать еще и цвет фона из которого эта функция будет картинку вырезать.

я под прозрачностью понял вообще прозрачность копируемого битмапа, ну 50% например. А "прозрачный цвет" - это цвет, который не копируется.


 
Gydvin ©   (2005-10-26 15:44) [8]

я под прозрачностью понял вообще прозрачность копируемого битмапа, ну 50% например

И это не проблема ;) есть код плавного претекания одного битмапа в другой, как бы всплывает изнутри, если там убрать цикл то вполне можно получить и прозрачность битмапа, на сколько хошь ;)


 
Antonn ©   (2005-10-26 15:59) [9]

Gydvin ©   (26.10.05 15:44) [8]
И это не проблема ;) есть код плавного претекания одного битмапа в другой, как бы всплывает изнутри, если там убрать цикл то вполне можно получить и прозрачность битмапа, на сколько хошь ;)

охотно верю, что не проблема:)
меня интересует, с какой скоростью это будет выполняться? :)


 
Gydvin ©   (2005-10-26 16:00) [10]

через scanline на порядок быстрее(чуть больше, чем на порядок):)


Все может быть, непробовал


 
Gydvin ©   (2005-10-26 16:01) [11]

Antonn ©   (26.10.05 15:59) [9]

Не тестил :(


 
Arazel/NikNet   (2005-10-26 18:57) [12]

Ну а как с RECT?


 
Gydvin ©   (2005-10-26 19:14) [13]

Уже вечер, вот "гибрид"

procedure DrawTransparentBmp(Cnv: TCanvas; x,y,Width1,Height1: Integer;   Bmp: TBitmap;xsrs1,ysrs1:integer; clTransparent: TColor);
var
 bmpXOR, bmpAND, bmpINVAND, bmpTarget: TBitmap;
 oldcol: Longint;
begin
 try
   bmpAND := TBitmap.Create;
   bmpAND.Width := Bmp.Width;
   bmpAND.Height := Bmp.Height;
   bmpAND.Monochrome := True;
   oldcol := SetBkColor(Bmp.Canvas.Handle, ColorToRGB(clTransparent));
   BitBlt(bmpAND.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, Bmp.Canvas.Handle, 0, 0, SRCCOPY);
   SetBkColor(Bmp.Canvas.Handle, oldcol);

   bmpINVAND := TBitmap.Create;
   bmpINVAND.Width := Bmp.Width;
   bmpINVAND.Height := Bmp.Height;
   bmpINVAND.Monochrome := True;
   BitBlt(bmpINVAND.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, bmpAND.Canvas.Handle, 0, 0, NOTSRCCOPY);

   bmpXOR := TBitmap.Create;
   bmpXOR.Width := Bmp.Width;
   bmpXOR.Height := Bmp.Height;
   BitBlt(bmpXOR.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, Bmp.Canvas.Handle, 0, 0, SRCCOPY);
   BitBlt(bmpXOR.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, bmpINVAND.Canvas.Handle, 0, 0, SRCAND);

   bmpTarget := TBitmap.Create;
   bmpTarget.Width := Width1;
   bmpTarget.Height := Height1;

   BitBlt(bmpTarget.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, Cnv.Handle, x, y, SRCCOPY);
   BitBlt(bmpTarget.Canvas.Handle, 0, 0, Width1, Height1, bmpAND.Canvas.Handle, xsrs1, ysrs1, SRCAND);
   BitBlt(bmpTarget.Canvas.Handle, 0, 0, Width1, Height1, bmpXOR.Canvas.Handle, xsrs1, ysrs1, SRCINVERT);
   BitBlt(cnv.Handle, x, y, Bmp.Width, Bmp.Height, bmpTarget.Canvas.Handle, 0, 0, SRCCOPY);

 finally
   bmpXOR.Free;
   bmpAND.Free;
   bmpINVAND.Free;
   bmpTarget.Free;

 end;
end;


Arazel/NikNet   (26.10.05 18:57) [12]

Ну а как с RECT?


можно и rect но bitblt быстрее


 
Добрый человек   (2005-10-26 21:09) [14]


> Arazel/NikNet   (26.10.05 18:57) [12]

Ну ты и туп, парень. Тебе ещё пару десятков примеров кинуть? Не, не буду, бесполезно, всё равно не поймёшь.


 
Arazel/NikNet   (2005-10-26 21:18) [15]

Нет просто я только умею с CopyRect вытаскивать минирисунки с  картинки
типа кнопки : Подсвеченая отсвеченая и нормальная все это в одном рисунке :( Как с помощью  вашего примера сделать это ?


 
Gydvin ©   (2005-10-27 13:15) [16]

Добрый человек   (26.10.05 21:09) [14]
Злой ты человек ;))))))

Arazel/NikNet

Пользуйся наздоровье.

Нужен битмап любого размера, на нем в ряд по горизонтали расположены 2 рисунка (при условие, что эти рисунки расположены каждый на своей половине в одинаковых местах своих участков) цвет фона clblack. Кидаешь его в папку проекта, вставляешь нижеприведенный код и компилишь, дальше сам.
А ваще можно прощитать и на тридцать три рисунка хошь вдоль, хошь поперек, хошь повертикали;)

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure DrawTransparentBmp(Cnv: TCanvas; x,y,Width1,Height1: Integer;   Bmp: TBitmap;xsrs1,ysrs1:integer; clTransparent: TColor);
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);

 private
   { Private declarations }
   bitmap:tbitmap;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.DrawTransparentBmp(Cnv: TCanvas; x,y,Width1,Height1: Integer;   Bmp: TBitmap;xsrs1,ysrs1:integer; clTransparent: TColor);
var
bmpXOR, bmpAND, bmpINVAND, bmpTarget: TBitmap;
oldcol: Longint;
begin
try
  bmpAND := TBitmap.Create;
  bmpAND.Width := Bmp.Width;
  bmpAND.Height := Bmp.Height;
  bmpAND.Monochrome := True;
  oldcol := SetBkColor(Bmp.Canvas.Handle, ColorToRGB(clTransparent));
  BitBlt(bmpAND.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, Bmp.Canvas.Handle, 0, 0, SRCCOPY);
  SetBkColor(Bmp.Canvas.Handle, oldcol);

  bmpINVAND := TBitmap.Create;
  bmpINVAND.Width := Bmp.Width;
  bmpINVAND.Height := Bmp.Height;
  bmpINVAND.Monochrome := True;
  BitBlt(bmpINVAND.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, bmpAND.Canvas.Handle, 0, 0, NOTSRCCOPY);

  bmpXOR := TBitmap.Create;
  bmpXOR.Width := Bmp.Width;
  bmpXOR.Height := Bmp.Height;
  BitBlt(bmpXOR.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, Bmp.Canvas.Handle, 0, 0, SRCCOPY);
  BitBlt(bmpXOR.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, bmpINVAND.Canvas.Handle, 0, 0, SRCAND);

  bmpTarget := TBitmap.Create;
  bmpTarget.Width := Width1;
  bmpTarget.Height := Height1;

  BitBlt(bmpTarget.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, Cnv.Handle, x, y, SRCCOPY);
  BitBlt(bmpTarget.Canvas.Handle, 0, 0, Width1, Height1, bmpAND.Canvas.Handle, xsrs1, ysrs1, SRCAND);
  BitBlt(bmpTarget.Canvas.Handle, 0, 0, Width1, Height1, bmpXOR.Canvas.Handle, xsrs1, ysrs1, SRCINVERT);
  BitBlt(cnv.Handle, x, y, Bmp.Width, Bmp.Height, bmpTarget.Canvas.Handle, 0, 0, SRCCOPY);

finally
  bmpXOR.Free;
  bmpAND.Free;
  bmpINVAND.Free;
  bmpTarget.Free;

end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
case button1.Tag  of
0:DrawTransparentBmp(canvas,0,0,bitmap.Width div 2 ,bitmap.Height,bitmap,0 ,0,clblack);
1:DrawTransparentBmp(canvas,0,0,bitmap.Width ,bitmap.Height,bitmap,bitmap.Width div 2,0,clblack);
end;
if button1.Tag=0 then button1.Tag:=1 else button1.Tag:=0;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
bitmap:=tbitmap.Create;
bitmap.LoadFromFile("myfile.bmp");
button1.Tag:=0;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
bitmap.Free;
end;

end.


 
Gydvin ©   (2005-10-27 13:55) [17]

хошь повертикали;)


Sorry по диагонали


 
Arazel ©   (2005-10-29 14:58) [18]

Gydvin Спасибо тебе огромное!!!


 
Fenik ©   (2005-10-29 19:45) [19]

> Gydvin ©  (27.10.05 13:15) [16]
> procedure TForm1.DrawTransparentBmp


Не быстрее ли будет попиксельно скопировать?
А то восемь одних только BitBlt... Ужасть.


 
Arazel ©   (2005-10-29 20:53) [20]

Fenik ©   (29.10.05 19:45) [19]
Сможешь быстрее  =) ?


 
Fenik ©   (2005-10-30 00:40) [21]

> Сможешь быстрее  =) ?

А то!
А ты? :))


 
Gydvin ©   (2005-10-30 10:10) [22]

Fenik ©   (30.10.05 00:40) [21]
А ну.


 
Fenik ©   (2005-10-30 14:33) [23]

Используя материал статьи http://www.delphimaster.ru/articles/pixels/index.html

uses UQPixels;

procedure QuickDrawTransparentBmp(Canvas: TCanvas;
 XDest, YDest, DestWidth, DestHeight: Integer;
 SrcBmp: TBitmap; XSrc, YSrc: Integer; TransparentColor: TColor);
var X, Y: Integer;
   Color: TColor;
   QPSrc, QPDest: TQuickPixels;
   Bmp: TBitmap;
begin
 Bmp := TBitmap.Create;
 try
   if (XSrc >= SrcBmp.Width) or (YSrc >= SrcBmp.Height) or
      (XSrc + DestWidth <= 0) or (YSrc + DestHeight <= 0) then Exit;
   if XSrc + DestWidth > SrcBmp.Width
     then Bmp.Width := SrcBmp.Width - XSrc
     else Bmp.Width := DestWidth;
   if YSrc + DestHeight > SrcBmp.Height
     then Bmp.Height := SrcBmp.Height - YSrc
     else Bmp.Height := DestHeight;
   Bmp.PixelFormat := pf24Bit;
   BitBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height,
     Canvas.Handle, XDest, YDest, SRCCOPY);
   QPSrc := TQuickPixels.Create;
   QPSrc.Attach(SrcBmp);
   QPDest := TQuickPixels.Create;
   QPDest.Attach(Bmp);
   try
     for X := 0 to Bmp.Width - 1 do
       for Y := 0 to Bmp.Height - 1 do begin
         Color := QPSrc.GetPixel(X + XSrc, Y + YSrc);
         if Color <> TransparentColor then
           QPDest.SetPixel(X, Y, Color);
       end;
   finally
     QPSrc.Free;
     QPDest.Free;
   end;
   BitBlt(Canvas.Handle, XDest, YDest, Bmp.Width, Bmp.Height,
     Bmp.Canvas.Handle, 0, 0, SRCCOPY);
 finally
   Bmp.Free;
 end;
end;


Быстрее на 80 - 1000 % (sic!), в зависимости от размеров и заполненности прозрачным цветом. Если же копировать из растра в растр, отпадет необходимость создавать лишний Bmp и дважды вызывать BitBlt, что увеличит скорость еще минимум в два раза.


 
Arazel ©   (2005-10-30 14:47) [24]

А ещё быстрее? А лучше быстрое сравнение?


 
Fenik ©   (2005-10-30 15:10) [25]

> Arazel ©  (30.10.05 14:47) [24]
> А ещё быстрее?


Можно и ещё быстрее. Подумай сам.

> А лучше быстрое сравнение?

Не понял.


 
Arazel ©   (2005-10-30 16:40) [26]

Мне бы  качественно растянуть изображение типа Strech


 
Antonn ©   (2005-10-30 16:45) [27]

поисчи на http://www.delphiworld.narod.ru/



Страницы: 1 вся ветка

Текущий архив: 2006.04.09;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.031 c
15-1142582154
Vlad Oshin
2006-03-17 10:55
2006.04.09
Можно ли в HP 6L 5L 1100 1200 печатать на рулонной бумаге?


2-1142887942
mrAndersen
2006-03-20 23:52
2006.04.09
enter


2-1143292123
Dust
2006-03-25 16:08
2006.04.09
Можно ли удалить объект в его же методе?


1-1141886515
Михаил (Киров)
2006-03-09 09:41
2006.04.09
Нуль-модемное соединение


1-1141390616
rolex
2006-03-03 15:56
2006.04.09
У некоторых текст отображается в виде ??? (вопросительных знаков)