Dá uma olhada aqui:
http://www.guj.com.br/posts/list/56248.java#295271
Deixei uma classe JImagePanel implementada lá que faz exatamente isso. E você ainda pode escolher entre deixar a imagem centralizada, estica-la ou deixa-la lado-a-lado, caso o painel seja maior que a imagem.
Agora, para reduzir a opacidade de uma imagem, use o método:
private BufferedImage applyAlpha(BufferedImage pb, float alpha) {
BufferedImage img = new BufferedImage(pb.getWidth(), pb.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = (Graphics2D) img.getGraphics().create();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
g2.drawImage(pb, 0, 0, null);
g2.dispose();
return img;
}
Onde alpha é um valor entre 0 e 1.0, sendo que 1 representa 100% opaco e 0 totalmente invisível.
O método não altera a imagem original, mas gera uma cópia dela com o alpha aplicado. Essa cópia é retornada pela função.
Aplique isso na imagem, antes de envia-la para o JImagePanel.