Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.045 c
6-1188144637
Max.66RUS
2007-08-26 20:10
2008.06.08
Отследить момент подключения компьютера к интернет...


2-1211026843
Ultimate
2008-05-17 16:20
2008.06.08
Загрузка определенной строки из файла


15-1209297079
Kostafey
2008-04-27 15:51
2008.06.08
С днем рождения ! 27 апреля


15-1208856014
samalex
2008-04-22 13:20
2008.06.08
Установка символа разделения целой и дробной части числа


9-1170551643
TGLCube
2007-02-04 04:14
2008.06.08
Как повернуть матрицу вокруг заданного вектора на определённый





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский