Пользовательский значок курсора загружен с дополнительным затененным пикселем - PullRequest
3 голосов
/ 27 февраля 2012

Я менял значок курсора при каждом нажатии определенной кнопки переключения.Но загруженное изображение содержит лишний пиксель в нижнем углу!Это раздражает, как будто на экране постоянно грязь.Я создал значок курсора с помощью младшего редактора иконок.Когда я открываю изображение с помощью программы просмотра фотографий Windows или фотошопа, пиксель не проявляет себя.Это показывает только когда я использую его в приложении.

Приложение является Java-приложением, и вот как я устанавливаю курсор.

Image img = getResourceMap().getImageIcon( iconFilename ).getImage();
        Cursor newCursor = Toolkit.getDefaultToolkit().createCustomCursor( img,
            new Point( 5, 5 ), "cursor" );

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

enter image description here

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

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

import javax.imageio.ImageIO;
import java.net.URL;

class ShowImage {

    public static void main(String[] args) throws Exception {
        URL url = new URL("http://i.stack.imgur.com/kP1jv.png");
        final BufferedImage img = ImageIO.read(url);
        System.out.println(
            "Image is: " + img.getWidth() + "x" + img.getHeight());
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                JLabel l = new JLabel(new ImageIcon(img));
                l.setBorder(new EmptyBorder(5,5,5,5));
                l.setOpaque(true);
                l.setBackground(Color.GREEN.darker());
                Cursor newCursor = Toolkit.getDefaultToolkit().
                    createCustomCursor( img,new Point( 5, 5 ), "c" );
                l.setCursor(newCursor);
                JOptionPane.showMessageDialog(null, l);
            }
        });
    }
}

1 Ответ

1 голос
/ 11 мая 2012

Сначала я подумал, что мы указываем большее изображение, чем может обработать размер системного курсора, но потом я понял, что если мы удалим последний столбец (!!) пикселей, это будет работать нормально !!Я не знаю, как это объяснить!

BufferedImage originalImg = ImageIO.read(new File("kP1jv.png"));
System.out.println("originalImage is: " + originalImg.getWidth() + "x"
                  + originalImg.getHeight());
Dimension d = Toolkit.getDefaultToolkit().getBestCursorSize(
                originalImg.getWidth(), originalImg.getHeight());

final BufferedImage img = originalImg.getSubimage(0, 0, d.width/*-1*/, d.height-1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...