我有10,000张照片需要调整大小,所以我有一个Java程序来做.不幸的是,图像的质量很差,我无法访问未压缩的图像.
import java.awt.Graphics;
import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* This class will resize all the images in a given folder
* @author
*
*/
public class JavaImageResizer {
public static void main(String[] args) throws IOException {
File folder = new File("/Users/me/Desktop/images/");
File[] listOfFiles = folder.listFiles();
System.out.println("Total No of Files:"+listOfFiles.length);
BufferedImage img = null;
BufferedImage tempPNG = null;
BufferedImage tempJPG = null;
File newFilePNG = null;
File newFileJPG = …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,用户可以在相册中上传图片,但自然上传的图像需要调整大小,因此也有拇指可用,所显示的图片也适合页面(例如800x600).我调整大小的方式是这样的:
Image scaledImage = img.getScaledInstance((int)width, (int)height, Image.SCALE_SMOOTH);
BufferedImage imageBuff = new BufferedImage((int)width, (int)height, BufferedImage.TYPE_INT_RGB);
Graphics g = imageBuff.createGraphics();
g.drawImage(scaledImage, 0, 0, new Color(0,0,0), null);
g.dispose();
Run Code Online (Sandbox Code Playgroud)
它工作得很好.我唯一的问题是这个g.drawImage()方法看起来非常慢,而我无法想象用户要耐心等待上传20张图片20*10秒~3分钟.事实上,在我的电脑上,为单张照片制作3种不同的调整大小需要近40秒.
这还不够好,我正在寻找更快的解决方案.我想知道是否有人可以通过调用shell脚本,命令告诉我有关更好的一个,或者通过调用shell脚本,命令,无论你知道什么,它必须更快,其他一切都无关紧要.
我正在使用javax.imageio.ImageIO保存BufferedImage为jpeg文件.特别是,我创建了以下Java函数:
public static void getScreenShot(BufferedImage capture, Path folder, String filename) {
try {
ImageIO.write(capture, "jpeg", new File(folder.toString()+"/"+filename+".jpg"));
} catch (AWTException | IOException ex) {
Logger.getLogger(ScreenShotMaker.class.getName()).log(Level.SEVERE, null, ex);
}
}
Run Code Online (Sandbox Code Playgroud)
同样任何图像处理软件,我希望改变jpeg文件的压缩级别.但是,我正在寻找似乎缺少的这个选项ImageIO.
我可以设置压缩级别以及如何设置?
任务: 我有一些图像,我缩小它们,并将它们连接到一个图像.但是我对实现有一点问题:
具体问题: 我想调整大小/缩放BufferedImage.getScaledInstance方法返回一个Image对象,但我无法将其强制转换为BufferedImage:
Exception in thread "main" java.lang.ClassCastException: sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage
Run Code Online (Sandbox Code Playgroud)
(我不知道为什么它是ToolkitImage而不是Image ...)
我找到了解决方案:
Image tmp = bi.getScaledInstance(SMALL_SIZE, SMALL_SIZE, BufferedImage.SCALE_FAST);
BufferedImage buffered = new BufferedImage(SMALL_SIZE,SMALL_SIZE,BufferedImage.TYPE_INT_RGB);
buffered.getGraphics().drawImage(tmp, 0, 0, null);
Run Code Online (Sandbox Code Playgroud)
但它很慢,我认为应该有更好的方法来做到这一点.
我需要BufferedImage,因为我必须让像素加入小图像.
有更好的(更好/更快)的方式吗?
编辑: 如果我首先将Image转换为ToolkitImage,它有一个getBufferedImage()方法.但它总是返回null.你知道为什么吗?
在脚本中,它从大约300x300标记下降到60x60.需要提高整体图像质量,因为它目前非常糟糕.
public static Boolean resizeImage(String sourceImg, String destImg, Integer Width, Integer Height, Integer whiteSpaceAmount)
{
BufferedImage origImage;
try
{
origImage = ImageIO.read(new File(sourceImg));
int type = origImage.getType() == 0? BufferedImage.TYPE_INT_ARGB : origImage.getType();
int fHeight = Height;
int fWidth = Width;
int whiteSpace = Height + whiteSpaceAmount; //Formatting all to squares so don't need two whiteSpace calcs..
double aspectRatio;
//Work out the resized dimensions
if (origImage.getHeight() > origImage.getWidth()) //If the pictures height is greater than the width then scale appropriately.
{ …Run Code Online (Sandbox Code Playgroud) int width = 175;
Graphics2D gb = (Graphics2D) g;
bufferedimage = (BufferedImage) createImage(width, width);
Graphics2D graphics = bufferedimage.createGraphics();
graphics.setColor(/*this.getBackground()*/Color.red);
graphics.fillRect(0, 0, width, width);
Run Code Online (Sandbox Code Playgroud)
嗨,我有缓冲大尺寸...我必须调整缓冲图像... PLZ你能帮助我吗?