Главная страница
    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.048 c
2-1210682233
Сергей
2008-05-13 16:37
2008.06.08
Как передать параметр от программы VB в Делфи?


15-1208981134
@!!ex_
2008-04-24 00:05
2008.06.08
Кому не лень - помогите.


15-1209325537
No_Dead
2008-04-27 23:45
2008.06.08
Есть ли такие проги или это уже ИИ?%>


2-1210886447
Johnnnnnn
2008-05-16 01:20
2008.06.08
Динамически создаваемый TWebBrowser событие OnDownloadComplete?


15-1209196391
Kolan
2008-04-26 11:53
2008.06.08
Как создать такую (см. каритнку) форму в InnoSetup?





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