Главная страница
    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.066 c
2-1211128627
pirks
2008-05-18 20:37
2008.06.08
TActionManager динамическое изменение свойст.


15-1208888750
TIF
2008-04-22 22:25
2008.06.08
Всё, ухожу в прошлое... Всем пока


3-1199432867
Ganda
2008-01-04 10:47
2008.06.08
сортировка символьного поля как целочисленное


15-1209541192
ПЛОВ
2008-04-30 11:39
2008.06.08
Разборка с NumLock


2-1210497060
Serj
2008-05-11 13:11
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский