Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.08;
Скачать: CL | DM;

Вниз

Проблема с 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
2-1211120855
Franzy
2008-05-18 18:27
2008.06.08
Как запустить из программы другую (консольную) программу?


15-1209024149
Anatoly Podgoretsky
2008-04-24 12:02
2008.06.08
Whete to buy DVBS in Estonia


2-1210690049
wnix
2008-05-13 18:47
2008.06.08
Работа с файлом


2-1210832368
troyan_81
2008-05-15 10:19
2008.06.08
Преобразование типов


2-1211044712
lewka-serdceed
2008-05-17 21:18
2008.06.08
Нажатие на Enter