Форум: "Начинающим";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];
ВнизПроблема с Transparent для TImage Найти похожие ветки
← →
MsGuns © (2008-05-15 12:36) [0]При указании иконки для имиджа в дизайне фон закрашивается как положено, однако в ран-тайме при отрисовке картинки из имажлиста фон почему-то белый
Код:
ImgDSEType.Picture.Bitmap := nil;
imlDSETypes.GetBitmap(2,ImgDSEType.Picture.Bitmap);
ImgDSEType.Transparent := true; // Маслим масляное, но результат тот же
← →
Ega23 © (2008-05-15 12:45) [1]Писал компонент TDBImageList, загружал картинки по запросу из БД
Код заполнения (не полностью)
var
ms : TMemoryStream;
bmp : TBitmap;
bf : TBLOBField;
ImageIndex : Integer;
......
bf := TBLOBField(FieldByName(FImgField));
if not bf.IsNull then
begin
ms := TMemoryStream.Create;
try
bf.SaveToStream(ms);
ms.Position := 0;
bmp := TBitmap.Create;
bmp.Transparent := True;
bmp.TransparentMode := tmAuto;
try
bmp.LoadFromStream(ms);
bmp.Width := Width;
bmp.Height := Height;
ImageIndex := AddMasked(bmp, bmp.TransparentColor);
if FOverlayImgField<>"" then
if FieldByName(FOverlayImgField).AsInteger<>255 then
Overlay(ImageIndex, FieldByName(FOverlayImgField).AsInteger);
except
ImageIndex:=-1;
end;
Примечание: ImageList считает за цвет транспарентной маски цвет левого нижнего пиксела картинки (ЕМНИП).
← →
Ega23 © (2008-05-15 12:47) [2]Собственно, непосредственное добавление в ImageList - AddMasked
← →
Ega23 © (2008-05-15 12:52) [3]З.Ы. Могу полный код компонента дать, но он "грязный", чистить надо. В принципе, поэтому и не выкладывал пока в Кладовку.
← →
MsGuns © (2008-05-15 14:20) [4]Вся фишка в том, что имажлист используется не только для отрисовки картинок, но и для экшнов, поэтому сами картинки в листе как бы нельзя трогать
← →
Ega23 © (2008-05-15 14:30) [5]
> Вся фишка в том, что имажлист используется не только для
> отрисовки картинок, но и для экшнов, поэтому сами картинки
> в листе как бы нельзя трогать
Ну и хрен с ним. Создавай Bitmap, ставь ему Transparent и TransparentMode, Бери в качестве TransparentColor цвет левого нижнего пикселя битмапа и листе, копируй.
Должно получиться.
← →
Ega23 © (2008-05-15 14:32) [6]
constructor TDBBitmapItem.Create(DataSet : TDataSet;
KeyField, ImageField : string; Transparent : Boolean=True);
var
ms : TMemoryStream;
bf : TBLOBField;
begin
Bitmap := nil;
BitmapID := DataSet.FieldByName(KeyField).AsInteger;
bf := TBLOBfield(DataSet.FieldByName(ImageField));
if bf.IsNull then Exit;
ms := TMemoryStream.Create;
try
bf.SaveToStream(ms);
ms.Position := 0;
Bitmap := TBitmap.Create;
if Transparent then
begin
Bitmap.Transparent := True;
Bitmap.TransparentMode := tmAuto;
end;
Bitmap.LoadFromStream(ms);
finally
ms.Free;
end;
end;
← →
MsGuns © (2008-05-15 15:03) [7]>Ega23 © (15.05.08 14:30) [5]
>Бери в качестве TransparentColor цвет левого нижнего пикселя битмапа и листе, копируй.
У меня нет цвета "фона", ибо он (цвет), может быть какой угодно
← →
Ega23 © (2008-05-15 15:23) [8]
> У меня нет цвета "фона", ибо он (цвет), может быть какой
> угодно
Блин. Битмап на что-то кладётся. Это "что-то" имеет свой цвет. Если битмапу назначить TransparentColor = (напрмер) 0, то он тогда все свои пиксели с цветом 0 перекрасит в цвет "чего-то".
По-умолчанию у битмапа (при Trasparent=True) за TransparentColor считается левый нижний пиксель.
← →
MsGuns © (2008-05-15 15:28) [9]>По-умолчанию у битмапа (при Trasparent=True) за TransparentColor считается левый нижний пиксель.
Пиксель картинки, но не панели (например), куда он всунут. Можно, конечно, определить этот цвет у парента, но некрасиво это как-то
← →
Style © (2008-05-15 15:34) [10]а помоему сначала нужно LoadFromStream(ms);
потом уже Transparent := true;
← →
Ega23 © (2008-05-15 15:42) [11]
> а помоему сначала нужно LoadFromStream(ms);
> потом уже Transparent := true;
выше приведённый код - работает. С прозрачностью всё нормально (за исключением, когда Control.Enabled := False, там свои приколы).
Может быть и нужно местами поменять, надо в генофонде смотреть. Сейчас времени нет.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.066 c