Размещенный код указывает, что OP рисует изображение в его исходном размере.Итак, мои комментарии по поводу кода:
a) Вы говорите, что хотите добавить изображение в JPanel, но по какой-то причине вы расширяете Canvas.Придерживайтесь компонентов Swing.Затем, если вам нужно сделать пользовательское рисование, вы должны переопределить метод paintComponent (), а не метод рисования.
б) Когда вы используете пользовательскую живопись, вы никогда не должны читать изображение в методе рисования.Этот метод можно вызывать множество раз.Возможно, что изображение не было полностью прочитано в память.Я знаю, что Swing будет автоматически перекрашиваться при чтении большей части изображения, я не уверен, как работает AWT Canvas.
c) Кроме того, при переопределении методов рисования не забывайте вызывать super.paint (), super.paintComponent (), иначе вы можете получить неожиданные результаты.
d) Однако, основываясь наВ опубликованном коде нет необходимости даже делать заказную покраску (поскольку вы рисуете изображение в его реальном размере).Просто создайте ImageIcon из изображения и добавьте Icon в JLabel.Затем вы просто добавляете метку в графический интерфейс.
Предлагаю вам прочитать раздел из учебника по Swing на Как использовать иконки .Если качество изображения низкое, проблема, возможно, связана с вашим изображением, поскольку теперь вы используете стандартный код, а не пользовательский код.