![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с Transparent для TImage
MsGuns © (2008-05-15 12:36:00)При указании иконки для имиджа в дизайне фон закрашивается как положено, однако в ран-тайме при отрисовке картинки из имажлиста фон почему-то белый
Код:
ImgDSEType.Picture.Bitmap := nil;
imlDSETypes.GetBitmap(2,ImgDSEType.Picture.Bitmap);
ImgDSEType.Transparent := true; // Маслим масляное, но результат тот же
Ega23 (2008-05-15 15:42:00) [1]
> а помоему сначала нужно LoadFromStream(ms);
> потом уже Transparent := true;
выше приведённый код - работает. С прозрачностью всё нормально (за исключением, когда Control.Enabled := False, там свои приколы).
Может быть и нужно местами поменять, надо в генофонде смотреть. Сейчас времени нет.
Style (2008-05-15 15:34:00) [2]а помоему сначала нужно LoadFromStream(ms);
потом уже Transparent := true;
MsGuns (2008-05-15 15:28:00) [3]>По-умолчанию у битмапа (при Trasparent=True) за TransparentColor считается левый нижний пиксель.
Пиксель картинки, но не панели (например), куда он всунут. Можно, конечно, определить этот цвет у парента, но некрасиво это как-то
Ega23 (2008-05-15 15:23:00) [4]
> У меня нет цвета "фона", ибо он (цвет), может быть какой
> угодно
Блин. Битмап на что-то кладётся. Это "что-то" имеет свой цвет. Если битмапу назначить TransparentColor = (напрмер) 0, то он тогда все свои пиксели с цветом 0 перекрасит в цвет "чего-то".
По-умолчанию у битмапа (при Trasparent=True) за TransparentColor считается левый нижний пиксель.
MsGuns (2008-05-15 15:03:00) [5]>Ega23 © (15.05.08 14:30) [5]
>Бери в качестве TransparentColor цвет левого нижнего пикселя битмапа и листе, копируй.
У меня нет цвета "фона", ибо он (цвет), может быть какой угодно
Ega23 (2008-05-15 14:32:00) [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;
Ega23 (2008-05-15 14:30:00) [7]
> Вся фишка в том, что имажлист используется не только для
> отрисовки картинок, но и для экшнов, поэтому сами картинки
> в листе как бы нельзя трогать
Ну и хрен с ним. Создавай Bitmap, ставь ему Transparent и TransparentMode, Бери в качестве TransparentColor цвет левого нижнего пикселя битмапа и листе, копируй.
Должно получиться.
MsGuns (2008-05-15 14:20:00) [8]Вся фишка в том, что имажлист используется не только для отрисовки картинок, но и для экшнов, поэтому сами картинки в листе как бы нельзя трогать
Ega23 (2008-05-15 12:52:00) [9]З.Ы. Могу полный код компонента дать, но он "грязный", чистить надо. В принципе, поэтому и не выкладывал пока в Кладовку.
Ega23 (2008-05-15 12:47:00) [10]Собственно, непосредственное добавление в ImageList - AddMasked
Ega23 (2008-05-15 12:45:00) [11]Писал компонент 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 считает за цвет транспарентной маски цвет левого нижнего пиксела картинки (ЕМНИП).