![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как скопировать из одного Bitmap в другой?
Arazel/NikNet © (2005-10-25 20:30:00)Как скопировать из одного Bitmap в другой?
Проблема такая:
Есть Bitmap, на котором загружено изображения
изображение состоит из трех картинок, которые
должны меняться во время работы программы
второй Bitmap не имеет не какого изображение
вот в него и должна загружаться одна из картинок
Суть вопроса таков:
Как мне из первого Bitmap(а) загружать одну
картинку, которая по размерам 23x26 (каждая)
в другой, что бы затем отобразить его?
Я пробиваю так, но не чего не получается:
TmpBmp.Canvas.CopyRect(
rect(0,0,23,26),
ImgBtns.Canvas,
Rect(0,0,23,26));
Antonn (2005-10-30 16:45:00) [1]поисчи на http://www.delphiworld.narod.ru/
Arazel (2005-10-30 16:40:00) [2]Мне бы качественно растянуть изображение типа Strech
Fenik (2005-10-30 15:10:00) [3]> Arazel © (30.10.05 14:47) [24]
> А ещё быстрее?
Можно и ещё быстрее. Подумай сам.
> А лучше быстрое сравнение?
Не понял.
Arazel (2005-10-30 14:47:00) [4]А ещё быстрее? А лучше быстрое сравнение?
Fenik (2005-10-30 14:33:00) [5]Используя материал статьи http://www.delphimaster.ru/articles/pixels/index.html
usesUQPixels;
procedureQuickDrawTransparentBmp(Canvas: TCanvas;
XDest, YDest, DestWidth, DestHeight: Integer;
SrcBmp: TBitmap; XSrc, YSrc: Integer; TransparentColor: TColor);
varX, 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) thenExit;
ifXSrc + DestWidth > SrcBmp.Width
thenBmp.Width := SrcBmp.Width - XSrc
elseBmp.Width := DestWidth;
ifYSrc + DestHeight > SrcBmp.Height
thenBmp.Height := SrcBmp.Height - YSrc
elseBmp.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
forX := 0 toBmp.Width - 1 do
forY := 0 toBmp.Height - 1 do begin
Color := QPSrc.GetPixel(X + XSrc, Y + YSrc);
ifColor <> 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, что увеличит скорость еще минимум в два раза.
Gydvin (2005-10-30 10:10:00) [6]Fenik © (30.10.05 00:40) [21]
А ну.
Fenik (2005-10-30 00:40:00) [7]> Сможешь быстрее =) ?
А то!
А ты? :))
Arazel (2005-10-29 20:53:00) [8]Fenik © (29.10.05 19:45) [19]
Сможешь быстрее =)?
Fenik (2005-10-29 19:45:00) [9]> Gydvin © (27.10.05 13:15) [16]
> procedure TForm1.DrawTransparentBmp
Не быстрее ли будет попиксельно скопировать?
А то восемь одних только BitBlt... Ужасть.
Arazel (2005-10-29 14:58:00) [10]GydvinСпасибо тебе огромное!!!
Gydvin (2005-10-27 13:55:00) [11]хошь повертикали;)
Sorry по диагонали
Gydvin (2005-10-27 13:15:00) [12]Добрый человек (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.
Arazel/NikNet (2005-10-26 21:18:00) [13]Нет просто я только умею с CopyRect вытаскивать минирисунки с картинки
типа кнопки : Подсвеченая отсвеченая и нормальная все это в одном рисунке :( Как с помощью вашего примера сделать это ?
Добрый человек (2005-10-26 21:09:00) [14]
> Arazel/NikNet (26.10.05 18:57) [12]
Ну ты и туп, парень. Тебе ещё пару десятков примеров кинуть? Не, не буду, бесполезно, всё равно не поймёшь.
Gydvin (2005-10-26 19:14:00) [15]Уже вечер, вот "гибрид"
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 быстрее
Arazel/NikNet (2005-10-26 18:57:00) [16]Ну а как с RECT?
Gydvin (2005-10-26 16:01:00) [17]Antonn © (26.10.05 15:59) [9]
Не тестил :(
Gydvin (2005-10-26 16:00:00) [18]через scanline на порядок быстрее(чуть больше, чем на порядок):)
Все может быть, непробовал
Antonn (2005-10-26 15:59:00) [19]Gydvin © (26.10.05 15:44) [8]
И это не проблема ;) есть код плавного претекания одного битмапа в другой, как бы всплывает изнутри, если там убрать цикл то вполне можно получить и прозрачность битмапа, на сколько хошь ;)
охотно верю, что не проблема:)
меня интересует, с какой скоростью это будет выполняться? :)
Gydvin (2005-10-26 15:44:00) [20]я под прозрачностью понял вообще прозрачность копируемого битмапа, ну 50% например
И это не проблема ;) есть код плавного претекания одного битмапа в другой, как бы всплывает изнутри, если там убрать цикл то вполне можно получить и прозрачность битмапа, на сколько хошь ;)