Добавить прозрачное и растянутое изображение в список изображений в Delphi

По моему предыдущему вопросу с помощью Cosmin Prund я нашел, как растянуть изображение и добавить в ImageList:

procedure LoadDatasetImagesToImageList;
var 
  StretchedBMP: TBitmap;
  MS: TMemoryStream;
begin
  ImageList.Clear;
  ItemsDts.First;
  StretchedBMP := TBitmap.Create;
try

  // Prepare the stretched bmp's size
  StretchedBMP.Width := ImageList.Width;
  StretchedBMP.Height := ImageList.Height;

  // Prepare the memory stream
  MS := TMemoryStream.Create;
  try
    ImageBitmap:= TBitmap.Create;
    try
      while not ItemsDts.Eof do
      begin
        if not ItemsDtsPicture.IsNull then
        begin
          MS.Size := 0;
          ItemsDtsPicture.SaveToStream(MS);
          MS.Position := 0;
          ImageBitmap.LoadFromStream(MS);
          // Stretch the image
          StretchedBMP.Canvas.StretchDraw(Rect(0, 0, StretchedBmp.Width-1, StretchedBmp.Height-1), ImageBitmap);
          ImageList.Add(StretchedBmp, nil);
        end;
        ItemsDts.Next;
      end;
    finally 
      ImageBitmap.Free;
    end;
  finally 
    MS.Free;
  end;
finally
  StretchedBMP.Free;
end;

Теперь проблема в том, что вставленное изображение не прозрачно в ImageList. При отображении элементов в TListview изображения не прозрачны. Но при обычном добавлении изображений (без растяжения и с использованием переменной StretchedBMP) изображения прозрачны.

PS: ссылка на предыдущий вопрос: Добавить растянутое изображение в ImageList в Delphi< /а>


person mtoloo    schedule 14.07.2011    source источник


Ответы (1)


Вы вызываете ImageList.Add и передаете nil изображение маски. Вы можете либо вычислить маску, соответствующую растянутому изображению, либо вызвать ImageList.AddMasked вместо этого список изображений вычисляет для вас маску на основе цвета, который вы определяете как «прозрачный» цвет. Вот что происходит, когда вы используете редактор компонентов списка изображений во время разработки.

person Rob Kennedy    schedule 14.07.2011
comment
Спасибо, это сработало для растровых изображений (TBitmap). Но можете ли вы сказать, что мне делать с изображениями Icon? (тикон) - person mtoloo; 14.07.2011
comment
В ПОРЯДКЕ. Кажется, мне не нужно изменять размер файлов значков. Я использую приведенный выше код только для растровых изображений. Иконки автоматически изменяются. - person mtoloo; 14.07.2011
comment
в настоящее время наиболее распространена прозрачность в альфа-канале 32-битного изображения, поэтому маска игнорируется. - person David Heffernan; 14.07.2011
comment
Я использую PNG с прозрачным фоном, однако при использовании ImageList.AddBitmap(TBitmap, nil, clNone, false, false) я получаю полностью черный значок. Нужно ли использовать маски, когда изображение уже прозрачно? Если да, то как? Использование clNone в качестве цвета фона? - person dialex; 22.02.2016
comment
Да, @Dialex, вам нужна маска, потому что изображения PNG используют альфа-прозрачность, а не простую битовую маску. Изображения PNG могут иметь частично прозрачные пиксели, поэтому вам нужна маска, чтобы сказать, какие частично прозрачные пиксели прозрачны, а какие непрозрачны. Вы можете спросить, как создать маску для изображения PNG, разместив вопрос на Stack Overflow. - person Rob Kennedy; 22.02.2016