-
Gpol (30.11.11 21:58) [0]Процедура складывает битмапы bmpIn1 и bmpIn2 с учетом альфа канала из bmpIn2.
А x1 и y1 это расположение bmpIn2 на bmpIn1.procedure BmpBlend(bmpIn1,bmpIn2:tbitmap; x1,y1: integer);
type PRGBarray = ^TRGBarray;
TRGBarray = array[0..30000] of TRGBQuad;
var x,y,w,h: integer;
colorLine1,colorLine2 : pRGBarray;
trfact:real;
function byteSum(op1,op2:byte):byte;
begin
if (op1+op2)>255 then
byteSum:=255 else
byteSum:=op1+op2;
end;
Begin
bmpin2.PixelFormat:=pf32bit;
bmpin1.PixelFormat:=pf32bit;
h:=bmpin2.Height; w:=bmpin2.Width;
for x:=1 to w-1 do begin
colorline1:=bmpin1.ScanLine[x+x1];
colorline2:=bmpin2.ScanLine[x];
for y := 1 to h-1 do begin
trfact:=colorline2[y].rgbReserved/255;
colorline1[y+y1].rgbBlue:=byteSum(trunc(colorline1[y+y1].rgbBlue*trfact),
trunc(colorline2[y].rgbBlue*(1-trfact)));
colorline1[y+y1].rgbGreen:=byteSum(trunc(colorline1[y+y1].rgbGreen*trfact),
trunc(colorline2[y].rgbGreen*(1-trfact)));
colorline1[y+y1].rgbRed:=byteSum(trunc(colorline1[y+y1].rgbRed*trfact),
trunc(colorline2[y].rgbRed*(1-trfact)));
end;
end;
End;
Так вот в при первом вызове процедуры все работает нормально. Но при втором и последующих вызовах ничего не происходит. Ума не приложу че за фигня -
antonn © (30.11.11 23:18) [1]размер накладываемого битмапа с учетом смещения не вылезает за границы результирующего?
в цикле стоит делать сначала цикл по Y, а потом по X, а сейчас там чехарда и потенциально - бага -
Gpol (01.12.11 19:19) [2]
> antonn © (30.11.11 23:18) [1]
> размер накладываемого битмапа с учетом смещения не вылезает
> за границы результирующего?в цикле стоит делать сначала
> цикл по Y, а потом по X, а сейчас там чехарда и потенциально
> - бага
проблема с "вылезанием" меня не волнует -
Андреевич (01.12.11 19:22) [3]а зря
-
Gpol (01.12.11 19:24) [4]
> Андреевич (01.12.11 19:22) [3]
> а зря
Я это сделаю потом, сейчас меня волнует не это. Неужели никто не поможет? почему во второй раз процедура не работает??? -
Андреевич (01.12.11 20:08) [5]цикл уже поправил?
-
Омлет © (01.12.11 22:19) [6]С таким кодом - не мудрено...
Во-первых, преобразование к 32-битному изображению ты производишь уже в самой процедуре. Что окажется в 4 байте, как думаешь?
Во-вторых, у тебя перепутаны x и y - для неквадратной картинки будет вылет.
В-третьих, где код вызова процедуры? Где тестовый проект с изображениями, на которых не работает? -
antonn © (01.12.11 22:59) [7]1 - если там было 32хбитное, то ничего не произойдет
-
Gpol (02.12.11 19:25) [8]вобщем я жестко лоханулся. Нужно было сделать image1.refresh;
закрывайте -
Андреевич (02.12.11 21:30) [9]на самом деле тебе нужно пересмотреть цикл, попробуй порисовать прямоугольную картинку
-
http://originalparfum.ru/muzhskaya/cielo
вобщем я жестко лоханулся. Нужно было сделать image1.refresh;
закрывайте
И как додумались об этом