Gdiplus 64-битные цвета

Я создаю 64-битное растровое изображение и оборачиваю его с помощью объекта Graphics, чтобы рисовать поверх него. Проблема в том, что класс Gdiplus Color только 32-битный (каждый компонент состоит только из байтов, т.е. макс. 255), так как я могу рисовать поверх 64-битного изображения с помощью gdiplus? например

Bitmap bmp(100, 100, PixelFormat64bppARGB);

Graphics g(&bmp);
//how do I draw a red line now, if i use Color(255,0,0) it comes as almost dark black red

person Anurag Uniyal    schedule 07.03.2009    source источник
comment
IIUC, 64bpp подразумевает ширину 16 бит для каждого компонента. Однако класс Color поддерживает только 8 бит на компонент. Одним из способов было бы извлечь пиксель и установить их самостоятельно, если это возможно. Никогда особо не работал с GDI, так что больше ничем помочь не могу :(   -  person dirkgently    schedule 07.03.2009
comment
да, это, кажется, единственный вариант, рисовать изображение и копировать буфер изображения, масштабируя до 16 бит, но это то, чего я хочу избежать.   -  person Anurag Uniyal    schedule 07.03.2009
comment
Не используйте класс Color, измените буфер напрямую.   -  person Ed S.    schedule 08.03.2009
comment
..если нет более простого способа, о котором я не знаю.   -  person Ed S.    schedule 08.03.2009
comment
Если бы мне пришлось изменить буфер Почему я буду использовать gdiplus, например. как вы рисуете шрифт Arial размером 12, используя буфер?   -  person Anurag Uniyal    schedule 14.03.2009


Ответы (3)


Кажется, Gdiplus не поддерживает 64-битные операции. Каким-то простым способом по-прежнему иметь возможность использовать методы Gdiplus было бы разделить изображение на два 32-битных изображения и работать с ними по отдельности.

Вы можете либо разделить каналы ARGB на AARR и GGBB, либо использовать два 32-битных изображения с младшими и старшими битами ARGB.

Оба варианта потребуют, чтобы вы либо написали функции-обертки, либо разделили каждый вызов на две части следующим образом:

// This is what you want to do (ARGB, 16 bit per channel)
// g.DrawLine(new Pen(Color(0, 65535, 1024, 31), 1, 0, 0, 100, 100);

// AARR GGBB variant
gAARR.DrawLine(new Pen(Color(0,0,255,255), 1, 0, 0, 100, 100);
gGGBB.DrawLine(new Pen(Color(4,0,0,31), 1, 0, 0, 100, 100);

// ARGBhigh ARGBlow variant
gHigh.DrawLine(new Pen(Color(0,255,4,0), 1, 0, 0, 100, 100);
gLow.DrawLine(new Pen(Color(0,255,0,31), 1, 0, 0, 100, 100);

Обратите внимание, что здесь я использовал порядок цветов (A, R, G, B), и я не уверен в этом. Согласно документации MSDN, это должно быть вместо этого изменено на Color(R,G,B,A). Если вам не нужен альфа-канал, вам следует предпочесть вариант highlow, так как вы все равно сможете использовать с ним Color(R,G,B).

Чтобы отобразить или сохранить результаты, вам нужно объединить 2 буфера.

person schnaader    schedule 07.03.2009
comment
Я не думаю, что это сработает, потому что вы испортите эффекты сглаживания и прозрачности. Даже если вы объединитесь разумно (что все еще является неопределенной концепцией ...), он все равно сделает неправильный выбор для сглаживания. - person Jason Cohen; 21.03.2009
comment
Все верно, могут быть/будут некоторые побочные эффекты, но я думаю, что с ними можно справиться (например, отключить сглаживание). Это по-прежнему кажется одним из лучших способов создания 64-битных образов без особых усилий. - person schnaader; 21.03.2009
comment
но в этом случае я просто нарисую 32-битное прозрачное изображение и снова скопирую его с масштабированием каждого пикселя до 64-битного, что намного проще. - person Anurag Uniyal; 24.03.2009


Вы можете использовать этот конструктор Bitmap для установки формата пикселей:

public:
Bitmap(
    int width, 
    int height, 
    PixelFormat format
)

РЕДАКТИРОВАТЬ: вы не сможете использовать класс Color (я думаю), поскольку он поддерживает только 32-битные цвета. Однако вы можете вызвать LockBits на растровом изображении и выполнить цикл вручную.

person Ed S.    schedule 07.03.2009
comment
это то, что я делаю, и вопрос не в том, как вы будете рисовать 64-битные цвета поверх него, используя графический объект gdiplus - person Anurag Uniyal; 07.03.2009
comment
Я не уверен, что вы имеете в виду, если вы доберетесь до буфера, каждый компонент будет 2 байта. - person Ed S.; 07.03.2009