我的应用程序中有一个名为"另存为"的方法,它将我的应用程序的图像保存到文件中.我使用JFileChooser让用户选择他们想要的位置来保存文件.问题是除非用户明确键入文件格式,否则它将保存没有扩展名的文件.如何在"文件类型"下拉菜单中使用jpg,png等格式.
并且,如何从"文件类型"下拉菜单中获取用于保存图像文件的扩展名.
ImageIO.write(image,extension,file);
Run Code Online (Sandbox Code Playgroud) 我用这个代码调整了两个因素的图像大小.它有效,但调整大小后图像质量非常糟糕!你能帮助我吗?
这是代码
public class ImageTest {
private static final int factor1 = 3;
private static final int factor2 = 4;
public static void main(String [] args){
JFileChooser cs = new JFileChooser();
cs.setFileSelectionMode(cs.DIRECTORIES_ONLY);
int i = cs.showOpenDialog(null);
if(i==cs.APPROVE_OPTION){
File f = cs.getSelectedFile();
File[] ff = f.listFiles();
for(int j=0;j<ff.length;j++){
String end = ff[j].getName().substring(ff[j].getName().indexOf(".")+1);
System.out.println(end);
try{
BufferedImage originalImage = ImageIO.read(ff[j]);
int type = originalImage.getType() == 0? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
BufferedImage resizeImageJpg = resizeImageWithHint(originalImage, type);
ImageIO.write(resizeImageJpg, end, new File("pr/"+ff[j].getName()));
}catch(IOException e){
e.printStackTrace();
}
} …Run Code Online (Sandbox Code Playgroud) 这是一个在这个网站上被问过100次的问题,但是我已经查看了所有这些问题,即使它们都已经解决了,但没有一个解决方案适合我.
这是我的代码的样子:
public Button1(Client client, String imgName) {
this.client = client;
try {
this.icon = ImageIO.read(this.getClass().getResourceAsStream("/resources/" + imgName));
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
代码运行时会导致以下错误:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
字符串imgName从子类传递给构造函数,并且是图像的名称(例如image.png).我还确保我的资源文件夹位于项目文件夹的根目录中,并作为源文件夹包含在eclipse项目中.我也确保System.getProperty("user.dir")指向正确的位置.我也尝试使用getResource()而不是getResourceAsStream(),但它仍然不起作用.
有人建议的上述答案将我的彩色图像转换为黑白图像.所以这不适合我的问题.
File file = new File("path");
BufferedImage bufferedImage = ImageIO.read( file );
Run Code Online (Sandbox Code Playgroud)
这是代码,下面是图像.下载图像并保存在您的电脑中.并尝试使用正确的path值运行上面的代码,它将在主题中引发异常
下载图片:https://skydrive.live.com/?cid = 19547371C4F3B839&id = 19547371C4F3B839%21105
简单地说,如果有人可以从图像中获取java.awt.image.BufferedImage对象,那就足够了(不应该将图像转换为灰度图像).
如果你能回答这个问题,你就是天才:D.Plz的帮助.
我有两个图像,我想将这两个图像复制到一个新图像,其中第二个图像在第一个图像旁边,而不是在它的顶部.
BufferedImage imgb1 = img1;
BufferedImage imgb2 = img2;
BufferedImage imgResult = new BufferedImage(...);
Run Code Online (Sandbox Code Playgroud)
其中imgResult包含彼此相邻的第一个和第二个图像.
我正在读取BufferedImage中的像素颜色,如下所示:
.....
InputStream is = new BufferedInputStream(conn.getInputStream());
BufferedImage image = ImageIO.read(is);
int color = image.getRGB(x, y);
int red = (colour & 0x00ff0000) >> 16;
int green = (colour & 0x0000ff00) >> 8;
int blue = colour & 0x000000ff;
Run Code Online (Sandbox Code Playgroud)
现在这个工作正常,除了透明度的png.我发现如果x,y指的是没有颜色的透明像素,我仍然会读取一种颜色,通常与图像中其他地方使用的颜色相同.
如何检测像素实际上是透明的而不是彩色的?
谢谢
在Windows上运行的一些Java代码中,我正在从磁盘读取一些大块RGB数据,并希望尽快将其显示在屏幕上.RGB数据是每通道8位,没有任何alpha.目前我有以下代码来创建BufferedImage.
BufferedImage getBufferedImage(File file, int width, int height) {
byte[] rgbData = readRGBFromFile(file);
WritableRaster raster = Raster.createInterleavedRaster(
rgbData, width, height,
width * 3, // scanlineStride
3, // pixelStride
new int[]{0, 1, 2}, // bandOffsets
null);
ColorModel colorModel = new ComponentColorModel(
ColorSpace.getInstance(ColorSpace.CS_sRGB),
new int[]{8, 8, 8}, // bits
false, // hasAlpha
false, // isPreMultiplied
ComponentColorModel.OPAQUE,
DataBuffer.TYPE_BYTE);
return new BufferedImage(colorModel, raster, false, null);
}
Run Code Online (Sandbox Code Playgroud)
问题是将此渲染到屏幕的性能非常慢.大约250 - 300毫秒.我已经读过,为了获得最佳性能,您需要在与屏幕兼容的BufferedImage中显示.为此,我将从上述方法返回的缓冲图像传递给这样的方法.
BufferedImage createCompatibleImage(BufferedImage image)
{
GraphicsConfiguration gc = GraphicsEnvironment.
getLocalGraphicsEnvironment().
getDefaultScreenDevice().
getDefaultConfiguration();
BufferedImage newImage = gc.createCompatibleImage( …Run Code Online (Sandbox Code Playgroud) 我有一个程序,我使用代码捕获屏幕:
robot = new Robot();
BufferedImage img = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
Run Code Online (Sandbox Code Playgroud)
现在我想将这个BufferedImage转换为Bitmap格式并通过函数返回它以满足其他需求,而不是将其保存在文件中.有什么帮助吗?
嗨我在内存中有一个BufferedImage实例,并希望将其转换为byte []以编码为base64字符串而不进行I/O操作以提高性能.我使用以下API:
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
ImageIO.write(image,"png",baos);
return baos.toByteArray();
Run Code Online (Sandbox Code Playgroud)
但是,此API仍隐式将映像写入OS临时目录,如果底层OS临时目录已满并且无法创建临时文件,则会导致失败.堆栈跟踪:
Caused by: java.io.IOException: No space left on device
at java.io.RandomAccessFile.write(RandomAccessFile.java:493)
at javax.imageio.stream.FileCacheImageOutputStream.write(FileCacheImageOutputStream.java:134)
at javax.imageio.stream.ImageOutputStreamImpl.write(ImageOutputStreamImpl.java:66)
at com.sun.imageio.plugins.png.PNGImageWriter.write_magic(PNGImageWriter.java:376)
at com.sun.imageio.plugins.png.PNGImageWriter.write(PNGImageWriter.java:1115)
at javax.imageio.ImageWriter.write(ImageWriter.java:628)
at javax.imageio.ImageIO.write(ImageIO.java:1480)
at javax.imageio.ImageIO.write(ImageIO.java:1554)
Run Code Online (Sandbox Code Playgroud)
在没有I/O的情况下进行转换是否有效(如内存转换或高效I/O)方式?请指教.
是否可以从JPanel创建BufferedImage而无需先在JFrame中呈现它?我搜遍了我能想到的任何地方,找不到答案.有人可以帮忙吗?
这是一些示例代码.如果我不取消注释JFrame代码,我的BufferedImage是空白的.
test(){
// JFrame frame = new JFrame();
JPanel panel = new JPanel();
Dimension dim = new Dimension(50,50);
panel.setMinimumSize(dim);
panel.setMaximumSize(dim);
panel.setPreferredSize(dim);
JLabel label = new JLabel("hello");
panel.add(label);
// frame.add(panel);
// frame.pack();
BufferedImage bi = getScreenShot(panel);
//...code that saves bi to a jpg
}
private BufferedImage getScreenShot(JPanel panel){
BufferedImage bi = new BufferedImage(panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_ARGB);
panel.paint(bi.getGraphics());
return bi;
}
Run Code Online (Sandbox Code Playgroud) bufferedimage ×10
java ×10
swing ×2
bitmap ×1
filefilter ×1
graphics ×1
image ×1
in-memory ×1
jfilechooser ×1
jframe ×1
jpanel ×1
resize ×1
transparency ×1