Форум: "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.02 c