Главная страница
    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.47 MB
Время: 0.038 c
15-1208894835
Jolik
2008-04-23 00:07
2008.06.08
Подскажите профайлер для Delphi 2007 for Win32


3-1199693050
vann
2008-01-07 11:04
2008.06.08
Как прочесть строку юникод из Access а?


15-1208948348
Maks0
2008-04-23 14:59
2008.06.08
Стойкость пароля в битах


15-1209311696
boriskb
2008-04-27 19:54
2008.06.08
К Ega23


15-1208258501
Kostafey
2008-04-15 15:21
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский