Converting ImageIcon to BufferedImage(如何设置图片类型)
Converting ImageIcon to BufferedImage (how to set image type)
我正在做的是非常简单的图像编辑程序,但我遇到了一些问题。我将图像保存在数据库中并将其转换为 ImageIcon
以便它可以通过服务器套接字等(可序列化)。
因此,通过 VO,我将 ImageIcon
转换为 GUI 并将其转换为 BufferedImage
,以便我可以对其进行编辑。但是由于我必须设置图像类型并且有很多图像类型不同的图片(至少看起来是这样),所以有些图片变成了我不希望它们成为的样子。
所以,基本上我是在问是否有另一种方法可以将 ImageIcon
转换为 BufferedImage
。一些无需设置单一固定图像类型即可进行转换的方法。如果有 none,我将不得不放弃那部分。
下面是我的部分代码:
private class TableSelectEvent extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
int selectedRow = table.getSelectedRow();
loadedImageIcon = UserImageReceived.get(selectedRow).getImage();
originalImage = loadedImageIcon.getImage();
selectedImageName = UserImageReceived.get(selectedRow).getFileName();
if (originalImage != null) {
Image rbi = originalImage.getScaledInstance(lblSelectedImage.getWidth(), lblSelectedImage.getHeight(), Image.SCALE_SMOOTH);
lblSelectedImage.setIcon(new ImageIcon(rbi));
bimage = new BufferedImage(originalImage.getWidth(null), originalImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);
// this, BufferedImage.TYPE_INT_ARGB part is the problem I'm having!
Graphics2D bgr = bimage.createGraphics();
bgr.drawImage(originalImage, 0, 0, null);
bgr.dispose();
} else {
System.out.println("originalImage == null");
}
}
}
如果您不需要透明度,您可以使用BufferedImage.TYPE_INT_RGB来解决您的问题。
如果您希望具有透明度,则需要通过以下方式设置将图像副本绘制到目标位置的方式:
Graphics2D bgr = bimage.createGraphics();
bgr.setComposite(AlphaComposite.SRC); // read the doc of this
你遇到的问题可能是因为当你创建一个新的 TYPE_INT_ARGB 类型的 BufferedImage 时,该图像中的所有像素都是透明的,所以当你将 src 图像绘制到它时,它会与这些透明像素混合并且所有图像都是透明的。解决方案是通过设置适当的 AplhaComposite 来使用其他合并 src 和 dst 图像的模式。
在数据库中只存储图像链接始终是一个好习惯。但这仍然取决于您的应用程序的场景,例如 - 您有一组固定的图像,需要一种简单的方法来进行备份,图像变化非常频繁。 Whosebug 中有很多文章 - 请继续阅读。 Store pictures as files or in the database for a web app?
一个解决方案是
BufferedImage bi = new BufferedImage(icon.getIconWidth(),icon.getIconHeight(),BufferedImage.TYPE_INT_RGB);
图形g = bi.createGraphics();
icon.paintIcon(null, g, 0,0);
g.dispose();
我正在做的是非常简单的图像编辑程序,但我遇到了一些问题。我将图像保存在数据库中并将其转换为 ImageIcon
以便它可以通过服务器套接字等(可序列化)。
因此,通过 VO,我将 ImageIcon
转换为 GUI 并将其转换为 BufferedImage
,以便我可以对其进行编辑。但是由于我必须设置图像类型并且有很多图像类型不同的图片(至少看起来是这样),所以有些图片变成了我不希望它们成为的样子。
所以,基本上我是在问是否有另一种方法可以将 ImageIcon
转换为 BufferedImage
。一些无需设置单一固定图像类型即可进行转换的方法。如果有 none,我将不得不放弃那部分。
下面是我的部分代码:
private class TableSelectEvent extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
int selectedRow = table.getSelectedRow();
loadedImageIcon = UserImageReceived.get(selectedRow).getImage();
originalImage = loadedImageIcon.getImage();
selectedImageName = UserImageReceived.get(selectedRow).getFileName();
if (originalImage != null) {
Image rbi = originalImage.getScaledInstance(lblSelectedImage.getWidth(), lblSelectedImage.getHeight(), Image.SCALE_SMOOTH);
lblSelectedImage.setIcon(new ImageIcon(rbi));
bimage = new BufferedImage(originalImage.getWidth(null), originalImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);
// this, BufferedImage.TYPE_INT_ARGB part is the problem I'm having!
Graphics2D bgr = bimage.createGraphics();
bgr.drawImage(originalImage, 0, 0, null);
bgr.dispose();
} else {
System.out.println("originalImage == null");
}
}
}
如果您不需要透明度,您可以使用BufferedImage.TYPE_INT_RGB来解决您的问题。
如果您希望具有透明度,则需要通过以下方式设置将图像副本绘制到目标位置的方式:
Graphics2D bgr = bimage.createGraphics();
bgr.setComposite(AlphaComposite.SRC); // read the doc of this
你遇到的问题可能是因为当你创建一个新的 TYPE_INT_ARGB 类型的 BufferedImage 时,该图像中的所有像素都是透明的,所以当你将 src 图像绘制到它时,它会与这些透明像素混合并且所有图像都是透明的。解决方案是通过设置适当的 AplhaComposite 来使用其他合并 src 和 dst 图像的模式。
在数据库中只存储图像链接始终是一个好习惯。但这仍然取决于您的应用程序的场景,例如 - 您有一组固定的图像,需要一种简单的方法来进行备份,图像变化非常频繁。 Whosebug 中有很多文章 - 请继续阅读。 Store pictures as files or in the database for a web app?
一个解决方案是 BufferedImage bi = new BufferedImage(icon.getIconWidth(),icon.getIconHeight(),BufferedImage.TYPE_INT_RGB); 图形g = bi.createGraphics(); icon.paintIcon(null, g, 0,0); g.dispose();