java实现图片缩放、旋转和马赛克化

2025-05-29 0 32

本文是作者结合网上的一些资料封装的java图片处理类,支持图片的缩放旋转马赛克化

不多说,上代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209
package deal;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.geom.AffineTransform;

import java.awt.image.AffineTransformOp;

import java.awt.image.BufferedImage;

import java.io.File;

import javax.imageio.ImageIO;

/**

* 图像处理类.

*

* @author nagsh

*

*/

public class ImageDeal {

String openUrl; // 原始图片打开路径

String saveUrl; // 新图保存路径

String saveName; // 新图名称

String suffix; // 新图类型 只支持gif,jpg,png

public ImageDeal(String openUrl, String saveUrl, String saveName,

String suffix) {

this.openUrl = openUrl;

this.saveName = saveName;

this.saveUrl = saveUrl;

this.suffix = suffix;

}

/**

* 图片缩放.

*

* @param width

* 需要的宽度

* @param height

* 需要的高度

* @throws Exception

*/

public void zoom(int width, int height) throws Exception {

double sx = 0.0;

double sy = 0.0;

File file = new File(openUrl);

if (!file.isFile()) {

throw new Exception("ImageDeal>>>" + file + " 不是一个图片文件!");

}

BufferedImage bi = ImageIO.read(file); // 读取该图片

// 计算x轴y轴缩放比例--如需等比例缩放,在调用之前确保参数width和height是等比例变化的

sx = (double) width / bi.getWidth();

sy = (double) height / bi.getHeight();

AffineTransformOp op = new AffineTransformOp(

AffineTransform.getScaleInstance(sx, sy), null);

File sf = new File(saveUrl, saveName + "." + suffix);

Image zoomImage = op.filter(bi, null);

try {

ImageIO.write((BufferedImage) zoomImage, suffix, sf); // 保存图片

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 旋转

*

* @param degree

* 旋转角度

* @throws Exception

*/

public void spin(int degree) throws Exception {

int swidth = 0; // 旋转后的宽度

int sheight = 0; // 旋转后的高度

int x; // 原点横坐标

int y; // 原点纵坐标

File file = new File(openUrl);

if (!file.isFile()) {

throw new Exception("ImageDeal>>>" + file + " 不是一个图片文件!");

}

BufferedImage bi = ImageIO.read(file); // 读取该图片

// 处理角度--确定旋转弧度

degree = degree % 360;

if (degree < 0)

degree = 360 + degree;// 将角度转换到0-360度之间

double theta = Math.toRadians(degree);// 将角度转为弧度

// 确定旋转后的宽和高

if (degree == 180 || degree == 0 || degree == 360) {

swidth = bi.getWidth();

sheight = bi.getHeight();

} else if (degree == 90 || degree == 270) {

sheight = bi.getWidth();

swidth = bi.getHeight();

} else {

swidth = (int) (Math.sqrt(bi.getWidth() * bi.getWidth()

+ bi.getHeight() * bi.getHeight()));

sheight = (int) (Math.sqrt(bi.getWidth() * bi.getWidth()

+ bi.getHeight() * bi.getHeight()));

}

x = (swidth / 2) - (bi.getWidth() / 2);// 确定原点坐标

y = (sheight / 2) - (bi.getHeight() / 2);

BufferedImage spinImage = new BufferedImage(swidth, sheight,

bi.getType());

// 设置图片背景颜色

Graphics2D gs = (Graphics2D) spinImage.getGraphics();

gs.setColor(Color.white);

gs.fillRect(0, 0, swidth, sheight);// 以给定颜色绘制旋转后图片的背景

AffineTransform at = new AffineTransform();

at.rotate(theta, swidth / 2, sheight / 2);// 旋转图象

at.translate(x, y);

AffineTransformOp op = new AffineTransformOp(at,

AffineTransformOp.TYPE_BICUBIC);

spinImage = op.filter(bi, spinImage);

File sf = new File(saveUrl, saveName + "." + suffix);

ImageIO.write(spinImage, suffix, sf); // 保存图片

}

/**

* 马赛克化.

* @param size 马赛克尺寸,即每个矩形的长宽

* @return

* @throws Exception

*/

public boolean mosaic(int size) throws Exception {

File file = new File(openUrl);

if (!file.isFile()) {

throw new Exception("ImageDeal>>>" + file + " 不是一个图片文件!");

}

BufferedImage bi = ImageIO.read(file); // 读取该图片

BufferedImage spinImage = new BufferedImage(bi.getWidth(),

bi.getHeight(), bi.TYPE_INT_RGB);

if (bi.getWidth() < size || bi.getHeight() < size || size <= 0) { // 马赛克格尺寸太大或太小

return false;

}

int xcount = 0; // 方向绘制个数

int ycount = 0; // y方向绘制个数

if (bi.getWidth() % size == 0) {

xcount = bi.getWidth() / size;

} else {

xcount = bi.getWidth() / size + 1;

}

if (bi.getHeight() % size == 0) {

ycount = bi.getHeight() / size;

} else {

ycount = bi.getHeight() / size + 1;

}

int x = 0; //坐标

int y = 0;

// 绘制马赛克(绘制矩形并填充颜色)

Graphics gs = spinImage.getGraphics();

for (int i = 0; i < xcount; i++) {

for (int j = 0; j < ycount; j++) {

//马赛克矩形格大小

int mwidth = size;

int mheight = size;

if(i==xcount-1){ //横向最后一个比较特殊,可能不够一个size

mwidth = bi.getWidth()-x;

}

if(j == ycount-1){ //同理

mheight =bi.getHeight()-y;

}

// 矩形颜色取中心像素点RGB值

int centerX = x;

int centerY = y;

if (mwidth % 2 == 0) {

centerX += mwidth / 2;

} else {

centerX += (mwidth - 1) / 2;

}

if (mheight % 2 == 0) {

centerY += mheight / 2;

} else {

centerY += (mheight - 1) / 2;

}

Color color = new Color(bi.getRGB(centerX, centerY));

gs.setColor(color);

gs.fillRect(x, y, mwidth, mheight);

y = y + size;// 计算下一个矩形的y坐标

}

y = 0;// 还原y坐标

x = x + size;// 计算x坐标

}

gs.dispose();

File sf = new File(saveUrl, saveName + "." + suffix);

ImageIO.write(spinImage, suffix, sf); // 保存图片

return true;

}

public static void main(String[] args) throws Exception {

ImageDeal imageDeal = new ImageDeal("e://1.jpg", "e://", "2", "jpg");

// 测试缩放

/* imageDeal.zoom(200, 300); */

// 测试旋转

/* imageDeal.spin(90); */

//测试马赛克

/*imageDeal.mosaic(4);*/

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:https://blog.csdn.net/u012116457/article/details/46445931

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 java实现图片缩放、旋转和马赛克化 https://www.kuaiidc.com/112516.html

相关文章

发表评论
暂无评论