Нарисуйте изображение с настраиваемой прозрачностью в GDI +

Я рисую множество изображений (все размеры = 24x24 pixelformat = 32BppPArgb) на Control, используя объект Drawing.Graphics и функцию DrawImage (). В моем приложении можно уменьшить масштаб, что означает, что объект Graphics имеет прикрепленную к нему матрицу преобразования, которая управляет как масштабированием, так и панорамированием.

Нет смысла рисовать эти значки, когда масштаб опускается ниже 50%, но я хотел бы сделать переход от рисования значков к тому, чтобы не рисовать значки более плавным. То есть, начиная с 70%, значки должны быть нарисованы с дополнительным коэффициентом прозрачности, чтобы они стали полностью прозрачными при 50%.

Как я могу нарисовать растровое изображение с дополнительной прозрачностью, не занимая значительно больше времени, чем DrawImage ()?

Спасибо Дэвид


person David Rutten    schedule 14.11.2009    source источник
comment
Я понимаю, что это вопрос GDI +, но думали ли вы о переходе на WPF? Это делает такие вещи абсолютно тривиальными, а также имеет множество других преимуществ. Похоже, ваше приложение достаточно сложное, чтобы использовать расширенные возможности WPF.   -  person Ray Burns    schedule 15.11.2009
comment
@Ray, это потребует переписывания более 50% приложения, на разработку которого у меня ушло 3 года. Я хотел бы иметь прозрачные растровые изображения, но не этой ценой.   -  person David Rutten    schedule 15.11.2009


Ответы (1)


Вы просто создаете соответствующий ColorMatrix, инициализируете с его помощью объект ImageAttributes и передаете этот объект ImageAttributes в одну из перегруженных версий Graphics.DrawImage. Этот образец даст вам 50% прозрачность:

  float[][] matrixAlpha =
  {
   new float[] {1, 0, 0, 0, 0},
   new float[] {0, 1, 0, 0, 0},
   new float[] {0, 0, 1, 0, 0},
   new float[] {0, 0, 0, 0.5f, 0}, 
   new float[] {0, 0, 0, 0, 1}
  }; 
  ColorMatrix colorMatrix = new ColorMatrix( matrixAlpha );

  ImageAttributes iaAlphaBlend = new ImageAttributes();
  iaAlphaBlend.SetColorMatrix(
   colorMatrix,
   ColorMatrixFlag.Default,
   ColorAdjustType.Bitmap );
person Dan Byström    schedule 15.11.2009
comment
Спасибо, Дэнбистром, похоже, именно то, что я искал. - person David Rutten; 16.11.2009