您好!请问用java怎么将截取png的图片中间一部分,以及如何压缩一个png图片?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了您好!请问用java怎么将截取png的图片中间一部分,以及如何压缩一个png图片?相关的知识,希望对你有一定的参考价值。

参考技术A

    getSubimage方法是进行图片裁剪。

举例:
public static void main(String[] args)
try
//从特定文件载入
BufferedImage bi = ImageIO.read(new File("c:\\\\test.png"));
bi.getSubimage(0, 0, 10, 10);//前两个值是坐标位置X、Y,后两个是长和宽
catch (IOException e)
e.printStackTrace();

    以下是进行的图片压缩,涉及到多个工具类。

/**
* 图片工具类
* 压缩图片大小
* @author Cyw
* @version 1.0
*/
public class ZIPImage

private File file = null;

private String outPutFilePath;

private String inPutFilePath;

private String inPutFileName;

private boolean autoBuildFileName;

private String outPutFileName;

private int outPutFileWidth = 100; // 默认输出图片宽

private int outPutFileHeight = 100; // 默认输出图片高

private static boolean isScaleZoom = true; // 是否按比例缩放

public ZIPImage()
outPutFilePath = "";
inPutFilePath = "";
inPutFileName = "";
autoBuildFileName = true;
outPutFileName = "";


/**

* @param ipfp
* 源文件夹路径
* @param ipfn
* 源文件名
* @param opfp
* 目标文件路径
* @param opfn
* 目标文件名
*/
public ZIPImage(String ipfp, String ipfn, String opfp, String opfn)
outPutFilePath = opfp;
inPutFilePath = ipfp;
inPutFileName = ipfn;
autoBuildFileName = true;
outPutFileName = opfn;


/**

* @param ipfp
* 源文件夹路径
* @param ipfn
* 源文件名
* @param opfp
* 目标文件路径
* @param opfn
* 目标文件名
* @param aBFN
* 是否自动生成目标文件名
*/
public ZIPImage(String ipfp, String ipfn, String opfp, String opfn,
boolean aBFN)
outPutFilePath = opfp;
inPutFilePath = ipfp;
inPutFileName = ipfn;
autoBuildFileName = aBFN;
outPutFileName = opfn;


public boolean isAutoBuildFileName()
return autoBuildFileName;


public void setAutoBuildFileName(boolean autoBuildFileName)
this.autoBuildFileName = autoBuildFileName;


public String getInPutFilePath()
return inPutFilePath;


public void setInPutFilePath(String inPutFilePath)
this.inPutFilePath = inPutFilePath;


public String getOutPutFileName()
return outPutFileName;


public void setOutPutFileName(String outPutFileName)
this.outPutFileName = outPutFileName;


public String getOutPutFilePath()
return outPutFilePath;


public void setOutPutFilePath(String outPutFilePath)
this.outPutFilePath = outPutFilePath;


public int getOutPutFileHeight()
return outPutFileHeight;


public void setOutPutFileHeight(int outPutFileHeight)
this.outPutFileHeight = outPutFileHeight;


public int getOutPutFileWidth()
return outPutFileWidth;


public void setOutPutFileWidth(int outPutFileWidth)
this.outPutFileWidth = outPutFileWidth;


public boolean isScaleZoom()
return isScaleZoom;


public void setScaleZoom(boolean isScaleZoom)
this.isScaleZoom = isScaleZoom;


public String getInPutFileName()
return inPutFileName;


public void setInPutFileName(String inPutFileName)
this.inPutFileName = inPutFileName;


/**
* 压缩图片大小

* @return boolean
*/
public boolean compressImage()
boolean flag = false;

try
if (inPutFilePath.trim().equals(""))
throw new NullPointerException("源文件夹路径不存在。");

if (inPutFileName.trim().equals(""))
throw new NullPointerException("图片文件路径不存在。");

if (outPutFilePath.trim().equals(""))
throw new NullPointerException("目标文件夹路径地址为空。");
else
if (!ZIPImage.mddir(outPutFilePath))
throw new FileNotFoundException(outPutFilePath
+ " 文件夹创建失败!");



if (this.autoBuildFileName) // 自动生成文件名
String tempFile[] = getFileNameAndExtName(inPutFileName);
outPutFileName = tempFile[0] + "_cyw." + tempFile[1];
compressPic();
else
if (outPutFileName.trim().equals(""))
throw new NullPointerException("目标文件名为空。");

compressPic();


catch (Exception e)
flag = false;
e.printStackTrace();
return flag;


return flag;


// 图片处理
private void compressPic() throws Exception
try
// 获得源文件
file = new File(inPutFilePath + inPutFileName);
if (!file.exists())
throw new FileNotFoundException(inPutFilePath + inPutFileName
+ " 文件不存在!");

Image img = ImageIO.read(file);
// 判断图片格式是否正确
if (img.getWidth(null) == -1)
throw new Exception("文件不可读!");
else
int newWidth;
int newHeight;
// 判断是否是等比缩放
if (ZIPImage.isScaleZoom == true)
// 为等比缩放计算输出的图片宽度及高度
double rate1 = ((double) img.getWidth(null))
/ (double) outPutFileWidth + 0.1;
double rate2 = ((double) img.getHeight(null))
/ (double) outPutFileHeight + 0.1;

// 根据缩放比率大的进行缩放控制
double rate = rate1 > rate2 ? rate1 : rate2;

newWidth = (int) (((double) img.getWidth(null)) / rate);
newHeight = (int) (((double) img.getHeight(null)) / rate);

else
newWidth = outPutFileWidth; // 输出的图片宽度
newHeight = outPutFileHeight; // 输出的图片高度


BufferedImage tag = new BufferedImage((int) newWidth,
(int) newHeight, BufferedImage.TYPE_INT_RGB);

/*
* Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
*/
tag.getGraphics().drawImage(
img.getScaledInstance(newWidth, newHeight,
Image.SCALE_SMOOTH), 0, 0, null);

FileOutputStream out = new FileOutputStream(outPutFilePath
+ outPutFileName);

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag);
out.close();


catch (IOException ex)
ex.printStackTrace();



/**
* 创建文件夹目录

* @param filePath
* @return
* @throws Exception
*/
@SuppressWarnings("unused")
private static boolean mddir(String filePath) throws Exception
boolean flag = false;
File f = new File(filePath);
if (!f.exists())
flag = f.mkdirs();
else
flag = true;

return flag;


/**
* 获得文件名和扩展名

* @param fullFileName
* @return
* @throws Exception
*/
private String[] getFileNameAndExtName(String fullFileName)
throws Exception
String[] fileNames = new String[2];
if (fullFileName.indexOf(".") == -1)
throw new Exception("源文件名不正确!");
else
fileNames[0] = fullFileName.substring(0, fullFileName
.lastIndexOf("."));
fileNames[1] = fullFileName
.substring(fullFileName.lastIndexOf(".") + 1);

return fileNames;


public Image getSourceImage() throws IOException
//获得源文件
file = new File(inPutFilePath + inPutFileName);
if (!file.exists())
throw new FileNotFoundException(inPutFilePath + inPutFileName
+ " 文件不存在!");

Image img = ImageIO.read(file);
return img;


/*
* 获得图片大小 
* @path :图片路径
*/
public long getPicSize(String path)
File file = new File(path);
return file.length();




//下面是测试程序

package com.sun.util.cyw;

import java.awt.Image;
import java.io.IOException;

public class ImageTest
public static void main(String[] args) throws IOException
ZIPImage zip=new ZIPImage("d:\\\\","1.jpg","d:\\\\test\\\\","处理后的图片.jpg",false);
zip.setOutPutFileWidth(1000);
zip.setOutPutFileHeight(1000);

Image image=zip.getSourceImage();
long size=zip.getPicSize("d:\\\\1.jpg");
System.out.println("处理前的图片大小 width:"+image.getWidth(null));
System.out.println("处理前的图片大小 height:"+image.getHeight(null));
System.out.println("处理前的图片容量:"+ size +" bit");

zip.compressImage();

参考技术B 用BufferedImage的getSubimage方法截图
用 ImageIO.write(image,"png",new FileOutputStream("a.png"))保存追问

我刚试了一下,好像好行,你可以写下具体的事例吗

追答

BufferedImage image = (BufferedImage)ImageIO.read(new File("aaaa.png"));
image.getSubimage(0,0,30,30);
ImageIO.write(image,"png",new FileOutputStream("a.png"))

追问

剪切的图片没变化,建议你自己试下

追答

自己看api 别建议我 我既然说可以就是可以的

追问

感谢非常,现在可以了

用matlab截取图像的一部分?

1.读入给定四幅图像并正确显示;
2.分别截取四幅图像中一部分正确显示

已经给定了四幅图像,分别是JPG,gif,PNG等格式,1我会,请问2怎么截图,好像要涉及坐标。请问那个函数能比较简单的截图?请写下完整程序,谢啦~

1、首先打开matlab,在命令行窗口中输入a=[1 5 6 7;8 12 14 16;6 3 5 7],创建一个3行4列的a矩阵,如下图所示。

2、输入x=find(a>10),找到a数组中大于10的元素的下标,如下图所示。

3、按回车键之后,可以看到找到大于10的元素下标,下标位置是按一列开始数,一列一列数的。

4、输入a(x)=[],将a数组中大于10的元素全部删除,如下图所示。

5、最后按回车键之后,可以看到a数组大于10的元素全部删除了,如下图所示。

参考技术A % 由于读入图像的方法你已经掌握,所以这里只示范怎样截取图像的部分
% 需要说明的主要有以下几点:
% 1、图像数据有索引色和真彩色这两种不同格式,截取前需要搞清楚是哪一种;
% 2、截取图像实际上就是取出数组的部分;
% 3、数组第一维为高度方向(从上到下),第二维为宽度方向(从左向右)。

% 载入MATLAB系统自带图像数据
load durer X map

% 显示原图像
subplot(1,2,1)
image(X)
colormap(map)
axis off; axis image
title('原图')

% 原图像为索引色,这个示范截取其右上角(宽度1/2,高度1/3)
subplot(2,2,2)
w = size(X,2); h=size(X, 1);
image( X(1:fix(h/3), fix(w/2):end) )
axis off; axis image
title('右上角(宽1/2,高1/3)')

% 下面示范示范截取真彩图
% 首先把索引色图像转换为真彩色,然后截取左下角(宽度1/3,高度1/2)
subplot(2,2,4)
rgb = ind2rgb(X, map);
w = size(rgb,2); h = size(rgb,1);
image( rgb(fix(h/2):end, 1:fix(w/3), :) )
axis off; axis image
title('左下角(宽1/3,高1/2)')追问

谢谢您了,你前面回答很好。就是有一个问题,有一幅图像是gif,彩色的,但我
a=imread(‘sst.gif’); %sst是图像名称%
imshow(a)
之后,本来是彩色的图片显示出来后的figure却是黑白的,老师说还要调用map色板,可我不知道语法,能否说一下?

还没问完,我发到你私信里了,我提高悬赏到70分了,就选你为正确答案了。请帮忙回答,多谢la~

追答

首先,你读取gif图像的方法有问题。因gif是索引色图像,所以读图像的时候仅仅读图像数据是不够的,还要带上调色板信息。至于怎样用调色板,前面其实已经示范过。

你的程序可以改成:
[a,map]=imread(‘sst.gif’); %sst是图像名称%
image(a)
colormap(map)

但这样有个问题:map是针对整个figure而非axes的,如果你有多个gif图要在同一个窗口里面显示,使用哪个图的map?事实上,使用哪个map都不合适。

这个问题怎么解决呢?其实上次也已经给了你解决的办法——使用ind2rgb把索引图转换成真彩图,真彩图的图像数据已经包含了完整的信息,和map无关。

追问

截图时,有一副彩色的JPG图片,我用whos看了一下,是这样的:
c 3000x2000x3 18000000 uint8 array %c是我令图片的变量
我用了 cat=c(10:125,20,250); imshow(cat) 结果显示出来了所截图像的一部分,但是截图是灰色的,怎么把颜色带进去呢? 让它显示成原来的颜色

追答

问题已经在另一个新开的帖子里解决了,我就不多说了。
其实真彩图的截取在我上面给的代码倒数第三行已经给出来了,你可能之前还是没看太明白。

至于你说的表达式
cat=c(10:125,20,250);
我认为是错误的,在6.5和R2007b里面测试也都报错,不知道你用的是什么版本?按常理,其他版本也不会允许这样的表达式。

本回答被提问者和网友采纳

以上是关于您好!请问用java怎么将截取png的图片中间一部分,以及如何压缩一个png图片?的主要内容,如果未能解决你的问题,请参考以下文章

请问,matlab中,如何将一幅从原图截取出来的一部分,还保存为原图的格式呢?

如何用PS从一张图片上截取一个矩形区域到另一张图片上

unity在导入图片的时候我只想用图片中的一部分素材改怎么办,就是如何准确的截取图片

各位大神,怎么把svg格式图片用代码转换成png格式或者jpg格式

opencv怎么截取视频图片

png图片太大怎么压缩(png图片怎么压缩大小)