Почему был бы GDI +, цвета варьируются базирующиеся прочь, видима ли подсказка?

Я отображаю битовый массив с помощью GDI +. После загрузки битового массива от ресурса DLL я выбрал цвет фона (синий - # 0000FF) к прозрачному использованию TransparentBlt. На Windows Vista и позже это работает как ожидалось.

Однако в системе Windows XP мы тестируем на этом, только работает, когда любая подсказка (например, свойство "заголовка" в IE или подсказка Windows Explorer, показанная при парении мыши над файлом, и т.д.), отображена. Остальная часть времени цвет фона является все еще синей.

Кто-либо встретился с этим прежде или знает о способе остановить это появление и для синего, который будет правильно сделан прозрачным?

Править: После дальнейшего расследования я нашел, что установка глубины цвета в Windows XP к цветам на 16 битов вместо цветов на 32 бита заставила TransparentBlt начинать работать обычно снова. Очевидно, это не идеальное решение, указывая, какая глубина цвета должна использоваться, но это дает какую-либо подсказку тому, что могло бы происходить?

Edit2: Пример кода включен.

m_pGDIBitmap = new Gdiplus::Bitmap(_Module.m_hInst, MAKEINTRESOURCE(lImageResource));
m_hMemDC = CreateCompatibleDC(hdc);

Gdiplus::Graphics myGraphics(m_hMemDC);

myGraphics.DrawImage(m_pGDIBitmap, 
    Gdiplus::Rect(0, 0, m_pGDIBitmap->GetWidth(), m_pGDIBitmap->GetHeight()), 
    0, 
    0,
    m_pGDIBitmap->GetWidth(), 
    m_pGDIBitmap->GetHeight(),
    Gdiplus::UnitPixel, &imAtt);

SetStretchBltMode(hdc, HALFTONE);
SetBrushOrgEx(hdc, rcBounds.left, rcBounds.top, NULL);
TransparentBlt(hdc, rcBounds.left, rcBounds.top, iScaledWidth, iScaledHeight, m_hMemDC, 0, 0, iBitmapWidth, iBitmapHeight, GetPixel(m_hMemDC, 0, 0));
1
задан dlanod 5 May 2010 в 04:01
поделиться

2 ответа

То, что я сделал, было скорее обходным решением, но оно сработало. Я изменил цвет фона на черный и добавил следующий код перед вызовом DrawImage:

Gdiplus::ImageAttributes imAtt;
imAtt.SetColorKey(Gdiplus::Color(0, 0, 0), Gdiplus::Color(0, 0, 0), Gdiplus::ColorAdjustTypeBitmap);

По какой-то причине использование этого с синим цветом, поскольку фон не сработало, и использование TransparentBlt отдельно с любым цветом не сработало, но Комбинация правильно применила прозрачность к различным ОС и глубине цвета, которые я пробовал.

Если бы у меня был доступ к программе рисования, которая поддерживает файлы растровых изображений с альфа-каналом, то есть 32-битные растровые изображения, я подозреваю, что сделать фон явно прозрачным, а затем использовать AlphaBlend, тоже сработало бы, но у меня не было возможности попробуйте это в то время.

1
ответ дан 3 September 2019 в 00:53
поделиться

Вы должны показать пример кода - код, который загружает растровое изображение и код, который блит его для отображения.

Из симптомов, которые вы описали, я предполагаю, что вы загружаете битмап не в его родном формате, а в текущем формате отображения. Это означает, что когда битовая глубина растрового изображения отличается от битовой глубины дисплея, происходит автоматическое преобразование цветового пространства. Когда это происходит, цвет, который вы предоставляете TransparentBlt, фактически отличается от цвета в растровом изображении.

Возможные альтернативные решения:

  1. Убедитесь, что растровое изображение загружается в родном формате без преобразования.

  2. Разрешите преобразование, но вместо того, чтобы предоставлять TransparentBlt жестко закодированное значение цвета, сделайте GetPixel известного "прозрачного" пикселя растровой карты (например, top-left), и предоставьте это значение TransparentBlt.

1
ответ дан 3 September 2019 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: