Решения:1- Читаем вот это: 1.1
Функция SetStretchBltMode, особенно про замечания о
HALFTONE1.2
Функция SetBrushOrgEx1.3
Функция StretchBlt1.4
Функция BitBlt1.5
Функция CreateDIBSection2-Мое решение(ИМХО): Если вызвать cdBmpOut.Canvas.FillRect(0,0,cdBmpOut.Width,cdBmpOut.Height); То все будет копироватся. Правильно или нет (маска копирования) косяг мне проверять... Читаем МСДН, если решите проблему отпишитесь, другим это тоже поможет. (Я просто не очень айс знаю вот эти операции копирования(ни разу не работал с этим)) Но смотрите что я тыкал, в зависимости от маски и цвета заливки, меняется выходной вариант. Правильно или нет я не вникал, возможно там и есть баги, по этому т.к вы занимаетесь этой проблемой и как видно уже не один день, вы сразу определитесь где бага, возможно там зарыта не одна кошка... если найдете пишите, тут пару ребят зарегены на багрепорты отпишут(проверят) короче сделают лазарус боллее стабильным.
Замечания: Ваша программа потребовала LCLBase>1.0.1 из за чего я удалил эту зависимость (возможно у меня сборка лазаруса более старая чем у вас)
Код:
- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
cdBmpIn, cdBmpOut: TBitmap;
oldPoint:TPoint;
begin
cdBmpIn :=TBitmap.Create;
cdBmpOut:=TBitmap.Create;
cdBmpIn.LoadFromFile('in.bmp');
oldPoint.x:=0;
oldPoint.y:=0;
cdBmpOut.Width :=ImagePreview.Width;
cdBmpOut.Height:=ImagePreview.Height;
cdBmpOut.Canvas.Brush.Color:=clRed;
cdBmpOut.Canvas.FillRect(0,0,cdBmpOut.Width,cdBmpOut.Height);
SetStretchBltMode(cdBmpOut.Canvas.Handle, HALFTONE);
//SetStretchBltMode(cdBmpOut.Canvas.Handle, BLACKONWHITE);
//SetStretchBltMode(cdBmpOut.Canvas.Handle, WHITEONBLACK);
//SetBrushOrgEx(cdBmpOut.Canvas.Handle,100,0,@oldPoint);
//StretchBlt(cdBmpOut.Canvas.Handle, 0, 0, cdBmpOut.Width, cdBmpOut.Height, cdBmpIn.Canvas.Handle,
// 0, 0, cdBmpIn.Width, cdBmpIn.Height, NOTSRCERASE);
StretchBlt(cdBmpOut.Canvas.Handle, 0, 0, cdBmpOut.Width, cdBmpOut.Height, cdBmpIn.Canvas.Handle,
0, 0, cdBmpIn.Width, cdBmpIn.Height, SRCCOPY);
ImagePreview.Picture.Bitmap:=cdBmpOut;
cdBmpOut.SaveToFile('out.bmp');
cdBmpIn.Free;
cdBmpOut.Free;
end;