Delphi: альфа-канал смешивания GR32 зависит от цвета Clear()
Я использовал изображение с альфа-каналом, и некоторые части изображения не полностью непрозрачны. Когда я рисую это на TImgView32
возражать, что разделы получают немного цвета от Clear()
цвет. Давайте покажем это на примере изображения:
Это оригинальное изображение, которое вы обычно видите в Photoshop:
И это изображение результата, когда я рисую его на новом слое в объекте GR32, который я очищал раньше Clear($00FF0000);
:
Результат прозрачный, как в фотошопе, но проблема в красном ореоле.
Или другой цвет с Clear($000000FF);
:
Обратите внимание, что, как вы знаете, цвет, который я использовал, полностью прозрачен.
Вот код, который я использовал для создания результата выше:
begin
ImageList.Bitmaps.Add; //ImageList is a TBitmap32List object
LoadPNGintoBitmap32(ImageList.Bitmap[0], ImgPath+'test.png', DummyBool);
BL:= TBitmapLayer.Create(ImgView.Layers);
ImgID:=0;
ScaleFactor:= 1;
LayerPos:= Point(100, 100);
with ImageList.Bitmap[ImgID] do
ImageRect:= Rect(0, 0, Width, Height);
{Auxilary variables}
CanvasWidth:= ImageRect.Right{*2}; //Extending width for two icon.
CanvasHeight:= ImageRect.Bottom;
BL.Location:= FloatRect(
LayerPos.X,
LayerPos.Y,
LayerPos.X + CanvasWidth * ScaleFactor,
LayerPos.Y + CanvasHeight * ScaleFactor
);
with BL.Bitmap do
begin
{Init}
SetSize(CanvasWidth, CanvasHeight);
DrawMode:= dmBlend;
Clear($00FF0000);
{Insert image}
Draw(0, 0, ImageRect, ImageList.Bitmap[ImgID]);
end;
if ScaleFactor<>1 then
TDraftResampler.Create(BL.Bitmap); //BL.Bitmap, because we used "Draw" method
end;
Как избежать этого и получить четкий результат, как в фотошопе?
2 ответа
Насколько я вижу, он работает как задумано, если вы используете cmBlend
режим комбинирования. cmBlend
не учитывает альфа-фон и, как указывается в документации, не должен использоваться для смешивания растровых изображений:
cmBlend - Быстрое смешивание цвета переднего плана с цветом фона, используя предоставленную альфа. Этот метод не подходит для работы и сохранения альфа-каналов. Используйте это больше, если вы хотите смешать непосредственно с буфером отображения.
Использовать cmMerge
вместо этого комбинируйте режим, когда важны и передний план, и фоновый альфа.
У меня недавно была похожая проблема
TImageList не поддерживает прозрачность, поэтому мне пришлось использовать TPngImageList, когда я хотел загрузить прозрачные изображения PNG в элементы управления во время выполнения.
TPngImageList доступен через поиск Google!