Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Почему происходит искажение глифа при вставке в канву? / 25 сообщений из 55, страница 1 из 3
12.03.2016, 11:32
    #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
12.03.2016, 11:45
    #39190507
Пытливый
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит искажение глифа при вставке в канву?
Че-то фигня какая-то с прикладыванием картинки творится, выбирается файл, а в тему не вставляется.
...
Рейтинг: 0 / 0
12.03.2016, 13:05
    #39190528
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит искажение глифа при вставке в канву?
Пытливый,
У тебя там скорее всего png с прозрачным краем и в bmp он преобразуется очень криво.
...
Рейтинг: 0 / 0
12.03.2016, 13:30
    #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
12.03.2016, 14:29
    #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
12.03.2016, 14:36
    #39190554
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит искажение глифа при вставке в канву?
Меланхолично...
А ведь битмапы с альфа-каналом существуют хрен знает с какой древности.
Вот чего стоило встроить их поддержку в генофонд, всего то одну функцию при отрисовке заменить и подправить конвертацию из других graphic-ов.
...
Рейтинг: 0 / 0
12.03.2016, 14:43
    #39190555
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит искажение глифа при вставке в канву?
Соколинский БорисМеланхолично...
А ведь битмапы с альфа-каналом существуют хрен знает с какой древности.
Вот чего стоило встроить их поддержку в генофонд, всего то одну функцию при отрисовке заменить и подправить конвертацию из других graphic-ов.
так в современных версиях Дельфей вроде как с альфа-каналом в битмапе нету проблем ?
...
Рейтинг: 0 / 0
12.03.2016, 14:53
    #39190559
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит искажение глифа при вставке в канву?
defecator,
судя по первому посту есть.
Может, конечно, это DE косячит с конвертацией, не проверял.
...
Рейтинг: 0 / 0
12.03.2016, 15:40
    #39190580
errorsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит искажение глифа при вставке в канву?
defecator,

Есть к сожалению.
Загрузить в TImageList без искажений в дизайнтайме полупрозрачную иконку невозможно.
Даже если загрузить в рантайме, но использовать TButton с иконкой - все равно проблемы - внутри TButton внутренний TImageList, в который немного криво копируются иконки из используемого ImageList.
...
Рейтинг: 0 / 0
12.03.2016, 15:44
    #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
12.03.2016, 15:53
    #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
12.03.2016, 16:15
    #39190589
Пытливый
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит искажение глифа при вставке в канву?
Спасибо всем откликнувшимся. Прекрасно сработал вариант от Сергея. С ним даже компактнее выходит, битмап не надо создавать промежуточный.
...
Рейтинг: 0 / 0
13.03.2016, 23:26
    #39191025
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит искажение глифа при вставке в канву?
VCL изначально не умеет нормально работать с альфаканалом. Поэтому пытаться отрисовать таковое средствами канвы чревато. И 32-битный bmp файл - это скорее "борландовское изобретение" стандартные виндовские программы его не понимаю и не используют. Более того я на вскидку не скажу какая программа при сохранении позволит сохранить в bmp с альфаканалом.
...
Рейтинг: 0 / 0
14.03.2016, 02:46
    #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
14.03.2016, 06:45
    #39191053
errorsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит искажение глифа при вставке в канву?
white_nigger,

Согласен с предидущим коментарием - 32-битный BITMAP это вполне стандартная фича WinApi, другое дело что далеко не все программы его поддерживают.
...
Рейтинг: 0 / 0
14.03.2016, 11:58
    #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
14.03.2016, 13:46
    #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
14.03.2016, 14:27
    #39191398
fd00ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит искажение глифа при вставке в канву?
Сергей N, 48bpp в BMP Native Codec все же нет. но про 64bpp - занятная инфа, если еще и работает как положено))
...
Рейтинг: 0 / 0
14.03.2016, 17:16
    #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
14.03.2016, 18:28
    #39191665
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит искажение глифа при вставке в канву?
Сергей N, не путайте файл с расширением BMP (о котором я писал) с понятием BITMAP в GDI. В памяти организация может быть различной, но это не значит, что это будет использоваться в файлах один-в-один. Найдите в своей системе 32-битный файлы BMP. Их там не и никогда не было. Потому как эти файлы использовались когда функции AlphaBlend ещё не было в системе. Поэтому и штатное средство, которое работает с BMP файлами ничего не знает о 32-битном BMP. Когда же появилась задача использовать альфа-канал, то начали использовать PNG. Поэтому ещё раз повторю 32-битный формат BMP - искусственный. То что его поддерживает пара программ, ситуацию не меняет.
PS: дле невнимательных, слово изобретение у меня было в кавычках. Наивно думать, что в фирме которая разрабатывает визуальные компоненты, не знают об устройстве картинок. И ссылочка, вами приведенная, извините, совсем о другом
...
Рейтинг: 0 / 0
14.03.2016, 18:35
    #39191672
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит искажение глифа при вставке в канву?
Ещё есть самая лучшая библиотека растровой графики за всё существование Delphi - это Graphics32
http://graphics32.org/wiki/Main/ThirdParty

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

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

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

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


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