2009-03-07 3 views
3

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

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 
+0

IIUC, 64bpp подразумевает ширину 16 бит для каждого компонента. Однако класс Color поддерживает только 8 бит на компонент. Один из способов - извлечь пиксель и установить его самостоятельно, если это возможно. Никогда не работал с GDI, поэтому не мог больше помочь :( – dirkgently

+0

да, это похоже только на вариант, чтобы рисовать и копировать буфер изображения, масштабируя до 16 бит, но этого я и хочу избежать. –

+0

Не используйте класс цвета, измените буфер непосредственно. –

ответ

0

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

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

EDIT: Вы не сможете использовать класс Color (я думаю), так как она поддерживает только 32-битные цвета , Однако вы можете вызвать LockBits в Bitmap и пропустить его вручную.

+0

thats, что я делаю, и вопрос не тот, как вы нарисуете 64-битные цвета над ним, используя графический объект gdiplus. –

+0

Я не уверен, что вы имеете в виду, если вы попадаете в буфер, каждый компонент будет 2 байта. –

+0

см. измененный вопрос –

2

Кажется, что 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 documentation, это должно быть заменено на Color (R, G, B, A). Если вам не нужен альфа-канал, вы должны предпочесть вариант с высоким разрешением, поскольку вы все равно сможете использовать с ним цвет (R, G, B).

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

+0

Я не думаю, что это сработает, потому что вы испортите эффекты сглаживания и прозрачности.Даже если вы сливаетесь «разумно» (это еще неопределенная концепция ...), он все равно сделает неправильный выбор для сглаживания. –

+0

Правильно, могут быть/будут какие-то побочные эффекты, но я думаю, что они могут быть обработаны (т. Е. Отключить сглаживание). По-прежнему представляется одним из лучших способов создания 64-битных изображений без особых усилий. – schnaader

+0

, но в этом случае я просто рисую на 32-битное прозрачное изображение и скопирую его снова с каждым пикселом, масштабированным до 64 бит, что намного проще. –

1

Вы не можете согласно MSDN - Image Pixel Format Constants:

Примечания

PixelFormat48bppRGB, PixelFormat64bppARGB и PixelFormat64bppPARGB используют 16 бит на компонента цвета (канала). Microsoft Windows GDI + версия 1.0 может читать 16-битные изображения на канал, но такие изображения преобразуются в формат формата 8 бит на канал для обработки, отображения и сохранения .