powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Почему происходит искажение глифа при вставке в канву?
25 сообщений из 55, страница 1 из 3
Почему происходит искажение глифа при вставке в канву?
    #39190503
Пытливый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот глиф до вставки и после. Разница очевидна. Что я делаю не так?
Код: pascal
1.
2.
3.
4.
5.
Bmp := TBitmap.Create;
 Bmp.Transparent := True;
 cxImageList1.GetImage(1, Bmp);
 Canvas.Draw(P.X, P.Y, Bmp);
 Bmp.Free;
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39190507
Пытливый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Че-то фигня какая-то с прикладыванием картинки творится, выбирается файл, а в тему не вставляется.
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39190528
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытливый,
У тебя там скорее всего png с прозрачным краем и в bmp он преобразуется очень криво.
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39190532
Сергей N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуйте заменить вывод значка из ImageList на канву функцией ImageList_DrawEx из CommCtrl (гораздо более быстрый способ):

Код: pascal
1.
2.
 ImageList_DrawEx(cxImageList1.Handle, {индекс значка} 1, Canvas.Handle, P.X, P.Y,
                           cxImageList1.Width, cxImageList1.Height, CLR_NONE, CLR_NONE, ILD_NORMAL);



P.S. Из моего общего опыта, у меня периодически возникали подобные казусы при работе с cxImegeList разных версий. При возможности (почти всегда) я использую либо стандартный ImageList, либо TPngImageList из дополнительной библиотеки PngComponents (работаю в D2007).
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39190551
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сергей NПопробуйте заменить вывод значка из ImageList на канву функцией ImageList_DrawEx из CommCtrl (гораздо более быстрый способ):

Код: pascal
1.
2.
 ImageList_DrawEx(cxImageList1.Handle, {индекс значка} 1, Canvas.Handle, P.X, P.Y,
                           cxImageList1.Width, cxImageList1.Height, CLR_NONE, CLR_NONE, ILD_NORMAL);



P.S. Из моего общего опыта, у меня периодически возникали подобные казусы при работе с cxImegeList разных версий. При возможности (почти всегда) я использую либо стандартный ImageList, либо TPngImageList из дополнительной библиотеки PngComponents (работаю в D2007).

А у меня наоборот, при использовании cxImageList проблем с прозрачностью нет, а вот ImageList по-простому не выведешь
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39190554
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меланхолично...
А ведь битмапы с альфа-каналом существуют хрен знает с какой древности.
Вот чего стоило встроить их поддержку в генофонд, всего то одну функцию при отрисовке заменить и подправить конвертацию из других graphic-ов.
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39190555
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Соколинский БорисМеланхолично...
А ведь битмапы с альфа-каналом существуют хрен знает с какой древности.
Вот чего стоило встроить их поддержку в генофонд, всего то одну функцию при отрисовке заменить и подправить конвертацию из других graphic-ов.
так в современных версиях Дельфей вроде как с альфа-каналом в битмапе нету проблем ?
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39190559
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,
судя по первому посту есть.
Может, конечно, это DE косячит с конвертацией, не проверял.
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39190580
errorsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,

Есть к сожалению.
Загрузить в TImageList без искажений в дизайнтайме полупрозрачную иконку невозможно.
Даже если загрузить в рантайме, но использовать TButton с иконкой - все равно проблемы - внутри TButton внутренний TImageList, в который немного криво копируются иконки из используемого ImageList.
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39190582
errorsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытливый,

Я написал эту функцию для получения действительно корректно полупрозрачного битмапа из TImageList, возможно для TcxImageList тоже подойдет:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
function ImageListGetBitmap(ImageList: TCustomImageList; Index: Integer; Bitmap: TBitmap): Boolean;
var
  Info: TIconInfo;
  DC: HDC;
  Icon: TIcon;
begin
  Result := (Bitmap <> nil) and ImageList.HandleAllocated and (Index > -1) and (Index < ImageList.Count);

  if Result then
    if (ImageList.ColorDepth <> TColorDepth.cd32Bit) then
      Result := ImageList.GetBitmap(Index, Bitmap)
    else
    begin
      Bitmap.SetSize(0, 0);
      // set alpha bitmap
      Bitmap.PixelFormat := TPixelFormat.pf32bit;
      Bitmap.AlphaFormat := TAlphaFormat.afDefined;
      // clear bitmap
      Bitmap.Canvas.Brush.Color := 0;
      Bitmap.Canvas.FillRect(Rect(0, 0, Bitmap.Width, Bitmap.Height));
      // new size
      Bitmap.SetSize(ImageList.Width, ImageList.Height);

      // create icon
      Icon := TIcon.Create;
      DC := 0;
      Info.hbmMask := 0;
      Info.hbmColor := 0;
      try
        // get icon
        ImageList.GetIcon(Index, Icon);
        GetIconInfo(Icon.Handle, Info);

        // select icon bitmap to dc
        DC := CreateCompatibleDC(Bitmap.Canvas.Handle);
        SelectObject(DC, Info.hbmColor);

        // copy icon to bitmap
        BitBlt(Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height,
          DC, 0, 0, SRCCOPY);
      finally
        DeleteDC(DC);
        DeleteObject(Info.hbmMask);
        DeleteObject(Info.hbmColor);
        Icon.Free;
      end;
    end;
end;
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39190585
errorsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
errorsoft,

В процессе переписывания лишние строчки появились, исправленный вариант:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
function ImageListGetBitmap(ImageList: TCustomImageList; Index: Integer; Bitmap: TBitmap): Boolean;
var
  Info: TIconInfo;
  DC: HDC;
  Icon: TIcon;
begin
  Result := (Bitmap <> nil) and ImageList.HandleAllocated and (Index > -1) and (Index < ImageList.Count);

  if Result then
    if (ImageList.ColorDepth <> TColorDepth.cd32Bit) then
      Result := ImageList.GetBitmap(Index, Bitmap)
    else
    begin
      Bitmap.SetSize(0, 0);
      // set alpha bitmap
      Bitmap.PixelFormat := TPixelFormat.pf32bit;
      Bitmap.AlphaFormat := TAlphaFormat.afDefined;
      // new size
      Bitmap.SetSize(ImageList.Width, ImageList.Height);

      // create icon
      Icon := TIcon.Create;
      DC := 0;
      Info.hbmMask := 0;
      Info.hbmColor := 0;
      try
        // get icon
        ImageList.GetIcon(Index, Icon);
        GetIconInfo(Icon.Handle, Info);

        // select icon bitmap to dc
        DC := CreateCompatibleDC(Bitmap.Canvas.Handle);
        SelectObject(DC, Info.hbmColor);

        // copy icon to bitmap
        BitBlt(Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height,
          DC, 0, 0, SRCCOPY);
      finally
        DeleteDC(DC);
        DeleteObject(Info.hbmMask);
        DeleteObject(Info.hbmColor);
        Icon.Free;
      end;
    end;
end;
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39190589
Пытливый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем откликнувшимся. Прекрасно сработал вариант от Сергея. С ним даже компактнее выходит, битмап не надо создавать промежуточный.
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39191025
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VCL изначально не умеет нормально работать с альфаканалом. Поэтому пытаться отрисовать таковое средствами канвы чревато. И 32-битный bmp файл - это скорее "борландовское изобретение" стандартные виндовские программы его не понимаю и не используют. Более того я на вскидку не скажу какая программа при сохранении позволит сохранить в bmp с альфаканалом.
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39191044
Сергей N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
white_nigger, с чего Вы взяли, что 32-битный bmp файл - это скорее "борландовское изобретение"? Поддержка BMP с битностью 1, 2, 4, 8, 16, 24, 32, 48 и 64 интегрирована в операционные системы Windows. Борланд, если что и сделал, то постарался облегчить работу с API-функциями при работе с графикой. Редактировать и сохранять bmp c альфа-каналом можно в различных программах для работы с графикой, например, всем известном, Photoshop. Другое дело, что в обычной программе для просмотра Вы не увидите прозрачности, но это не значит, что ее там нет и ее нельзя использовать в собственных программах. При работе на уровне API Вам все равно придется иметь дело с BITMAP. Однако, по-сути, данный вопрос выходит за рамки этого топика.
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39191053
errorsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
white_nigger,

Согласен с предидущим коментарием - 32-битный BITMAP это вполне стандартная фича WinApi, другое дело что далеко не все программы его поддерживают.
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39191247
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Nwhite_nigger, с чего Вы взяли, что 32-битный bmp файл - это скорее "борландовское изобретение"? Поддержка BMP с битностью 1, 2, 4, 8, 16, 24, 32, 48 и 64 интегрирована в операционные системы Windows. BMP c 48 и 64 bpp не бывает, из стандартных форматов такое поддерживают только PNG и DICOM.
Что касается 32 bpp, то изначально 4 байт добавлялся только для ускорения, ибо проц. с триадами работает крайне неэффективно. Такой формат назывался BGRX. Потом решили, что глупо держать пустой байт если можно туда запихнуть альфа-канал, получился формат BGRA. Поскольку эти два формата никак не различимы с т.з. метаданных, способ их обработки целиком и полностью определяется софтом - если хочет использовать альфу, рисует через AlphaBlend, не хочет - обычными функциями.
И отдельный вопрос - что именно там кодируется: прозрачность или плотность. Тут в GDI и GDI+ мнения расходятся .
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39191348
Сергей N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Соколинский Борис, речь шла об общих принципах поддержки BMP, в том числе и Bits Per Pixel ( https://msdn.microsoft.com/en-us/library/windows/desktop/ee719797(v=vs.85).aspx ). Там есть и 48 и 64. Какая-то у Вас вольная трактовка истории развития формата BMP. Речь, наверное, идет о совместимости GDI и GDI+. Там действительно могут быть проблемы, например, с пропаданием альфа канала.
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39191398
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей N, 48bpp в BMP Native Codec все же нет. но про 64bpp - занятная инфа, если еще и работает как положено))
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39191595
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей NСоколинский Борис, речь шла об общих принципах поддержки BMP, в том числе и Bits Per Pixel ( https://msdn.microsoft.com/en-us/library/windows/desktop/ee719797(v=vs.85).aspx ). Там есть и 48 и 64.

Там они может и есть, только в формате BMP их нет.
https://msdn.microsoft.com/en-us/library/windows/desktop/dd183391(v=vs.85).aspx
Изволите видеть, что и для 4 и для 5 версий на 32 bpp все заканчивается.

Также нет их и в описании структуры в памяти
https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx
Видимо, если они и присутствуют, то в каком-то проприетарном формате, с которым непонятно как следует работать.

Сергей N Какая-то у Вас вольная трактовка истории развития формата BMP.
За давностью лет, возможно чего-то подзабыл, но вряд ли.
В оригинальном описании формата 32bpp четко указано: The high byte in each DWORD is not used.
Вместе с тем, из описания функции AlphaBlend следует, что в последнем байте все же можно задавать прозрачность
https://msdn.microsoft.com/en-us/library/windows/desktop/dd183393(v=vs.85).aspx

Вот такая вот загогулина, понимаешь (с)
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39191665
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей N, не путайте файл с расширением BMP (о котором я писал) с понятием BITMAP в GDI. В памяти организация может быть различной, но это не значит, что это будет использоваться в файлах один-в-один. Найдите в своей системе 32-битный файлы BMP. Их там не и никогда не было. Потому как эти файлы использовались когда функции AlphaBlend ещё не было в системе. Поэтому и штатное средство, которое работает с BMP файлами ничего не знает о 32-битном BMP. Когда же появилась задача использовать альфа-канал, то начали использовать PNG. Поэтому ещё раз повторю 32-битный формат BMP - искусственный. То что его поддерживает пара программ, ситуацию не меняет.
PS: дле невнимательных, слово изобретение у меня было в кавычках. Наивно думать, что в фирме которая разрабатывает визуальные компоненты, не знают об устройстве картинок. И ссылочка, вами приведенная, извините, совсем о другом
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39191672
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ещё есть самая лучшая библиотека растровой графики за всё существование Delphi - это Graphics32
http://graphics32.org/wiki/Main/ThirdParty

Офигенная, использую с 2001 года.

А с персонажем Goodok начинали вместе работать как раз в том же 2001 году над интерфейсов G32 Interface - нам надо было эротично, с антиалиасингом и прочими няшками нарисовать Кремлёвский концертный зал для parter.ru, на который мы вместе пахали за одним столом

Там есть и мой говнокод (отрисовка Безье) )
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39191682
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorв том же 2001 году над интерфейсов G32 Interface - нам надо было эротично, с антиалиасингом и прочими няшками нарисоватьпочему GDI+ не использовали, которая как раз тогда же (?) и вышла с Windows XP? :-)
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39191687
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисИзволите видеть, что и для 4 и для 5 версий на 32 bpp все заканчивается.если точнее - 32 битами заканчивается поддержка битмапов в GDI, к которой и относятся эти bitmap header'ы
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39191693
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
fd00chdefecatorв том же 2001 году над интерфейсов G32 Interface - нам надо было эротично, с антиалиасингом и прочими няшками нарисоватьпочему GDI+ не использовали, которая как раз тогда же (?) и вышла с Windows XP? :-)

Ну, наверное, потому, что не знали про неё, зато хорошо знали про G32
...
Рейтинг: 0 / 0
Почему происходит искажение глифа при вставке в канву?
    #39191705
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый большой плюс и одновременно минус GDI+ это софтварная реализация всего. С одной стороны отвязка от специфики графических карт, с другой тормоза по сравнению с pure-GDI
...
Рейтинг: 0 / 0
25 сообщений из 55, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Почему происходит искажение глифа при вставке в канву?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]