Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Вниз

Как скопировать из одного 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 вся ветка

Форум: "Media";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.012 c
2-1143386444
AlexanderMS
2006-03-26 19:20
2006.04.09
Сочетание клавиш


15-1142921086
Ega23
2006-03-21 09:04
2006.04.09
С Днём рождения! 21 марта


2-1143531214
Andrey V.
2006-03-28 11:33
2006.04.09
Помогите с "тривиальным" запросом


2-1143022002
nub
2006-03-22 13:06
2006.04.09
Форматирование кода в Delphi


4-1137749947
not_dev
2006-01-20 12:39
2006.04.09
Контроль компонентов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский