JAVA来自URL的损坏图像
我正试图从URL加载此文件,但收到类似的图像 代码:JAVA来自URL的损坏图像,java,swing,io,javax.imageio,Java,Swing,Io,Javax.imageio,我正试图从URL加载此文件,但收到类似的图像 代码: 我有一些从URL到本地的代码副本文件。。到目前为止,结果与实际来源相同。只是做一些修改也许可以帮助解决这个问题 import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.net.URL; import java.util.ArrayList; import org.apache.commons.io.Filename
我有一些从URL到本地的代码副本文件。。到目前为止,结果与实际来源相同。只是做一些修改也许可以帮助解决这个问题
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import org.apache.commons.io.FilenameUtils;
import javax.imageio.ImageIO;
public class ImagesUrlToImagesLocal {
public ArrayList<String> getIt(ArrayList<String> urlFile)
{
ArrayList<String> strResult = new ArrayList<String>();
Image imagesUrl = null;
String baseName = null;
String extension = null;
File outputfile = null;
try {
for (int i = 0; i < urlFile.size(); i++)
{
URL url = new URL(urlFile.get(i));
baseName = FilenameUtils.getBaseName(urlFile.get(i));
extension = FilenameUtils.getExtension(urlFile.get(i));
imagesUrl = ImageIO.read(url);
BufferedImage image = (BufferedImage) imagesUrl;
outputfile = new File("temp_images/" + baseName + "." + extension);
ImageIO.write(image, extension, outputfile);
strResult.add("temp_images/" + baseName + "." + extension);
}
} catch (Exception e) {
e.printStackTrace();
}
return strResult;
}
}
导入java.awt.Image;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.net.URL;
导入java.util.ArrayList;
导入org.apache.commons.io.FilenameUtils;
导入javax.imageio.imageio;
公共类ImagesUrlToImagesLocal{
公共ArrayList getIt(ArrayList urlFile)
{
ArrayList strResult=新的ArrayList();
图像imagesUrl=null;
字符串baseName=null;
字符串扩展名=null;
File outputfile=null;
试一试{
对于(int i=0;i
paintComponent
方法中的图像,因为该方法是在事件调度程序线程(EDT)上执行的,这会使应用程序显得迟缓。此外,每当您的组件被重新绘制时,它将被重新读取,这意味着您将反复下载图像。相反,请提前阅读,或在单独的线程中阅读(即使用SwingWorker
),并且仅从paintComponent
方法内部调用g.drawImage(…)
)-1
),而是无条件复制512
字节。但是,您不需要在此处执行此操作,只需将流传递到ImageIO.read
,如下所示,使代码更简单、更可读:
URL url = new URL("http://s.developers.org.ua/img/announces/java_1.jpg");
try (BufferedInputStream in = new BufferedInputStream(url.openStream())) {
BufferedImage img = ImageIO.read(in);
}
添加额外的try
(try with resources)块可确保流也正确关闭,以避免资源泄漏// ... as above ...
byte[] b = new byte[512];
int bytesRead; // Keep track of the number of bytes read into 'b'
while ((bytesRead = in.read(b)) != -1)
out.write(b, 0, bytesRead);
我不知道这是否是唯一的问题,但你可能写得比你得到的更多。 我建议您将编写代码更改为:
int len;
while ((len=in.read(b))!=-1)
out.write(b, 0, len);
否则,如果最后一个缓冲区的长度不是512字节,您将写入太多
int len;
while ((len=in.read(b))!=-1)
out.write(b, 0, len);