PNG изображение с прозрачностью на SWT - PullRequest
3 голосов
/ 02 декабря 2009

Я получил Composite и хотел бы использовать файл png в качестве фонового изображения. Я могу это сделать, проблема в том, что когда изображение использует прозрачность, оно не работает и вместо этого показывает белый цвет. Есть мысли о том, как заставить это работать?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 16 декабря 2009

Помогает ли эта статья?

Взгляд на SWT Images

В нем говорится о рисовании изображения (хотя и GIF) в Canvas с прозрачностью (Canvas расширяется Composite).

1 голос
/ 09 марта 2014

РЕШИТЬ! Я решил именно эту проблему - отображение файлов PNG, которые содержат прозрачные области. Я не смог заставить его работать с надписями (на самом деле в статье , цитируемой говорится «Label не поддерживает нативную прозрачность»), поэтому вместо этого я поместил изображение прямо в холст. Другим ключом к успеху является использование конструктора Image, который включает 3-й параметр, который является маской прозрачности. Дополнительный шаг, который я сделал, это вызов setRegion, что означает, что события мыши (например, щелчки мыши) запускаются только тогда, когда они происходят над видимыми пикселями.

ImageData id = new ImageData("basket.png");
Image image = new Image (display, id, id); //3rd parameter is transparency mask
Canvas c = new Canvas (shell, SWT.TRANSPARENT);
c.addPaintListener(
    new PaintListener(){
        public void paintControl(PaintEvent e) 
        {
            e.gc.drawImage(image, 0, 0);
        }
    }
);

//the image has been created, with transparent regions. Now set the active region
//so that mouse click (enter, exit etc) events only fire when they occur over
//visible pixels. If you're not worried about this ignore the code that follows
Region region = new Region();
Rectangle pixel = new Rectangle(0, 0, 1, 1);
for (int y = 0; y < id.height; y++)
{
    for (int x = 0; x < id.width; x++)
    {
        if (id.getAlpha(x,y) > 0)
        {
            pixel.x = id.x + x;
            pixel.y = id.y + y;
            region.add(pixel);
        }
    }
}
c.setRegion(region);
...