java 图片处理

java

  1 /*

2 * 图片处理类

3 */

4 package image;

5

6 import com.sun.image.codec.jpeg.JPEGCodec;

7 import com.sun.image.codec.jpeg.JPEGEncodeParam;

8 import com.sun.image.codec.jpeg.JPEGImageEncoder;

9 import java.awt.AlphaComposite;

10 import java.awt.Color;

11 import java.awt.Graphics2D;

12 import java.awt.Image;

13 import java.awt.Rectangle;

14 import java.awt.RenderingHints;

15 import java.awt.Transparency;

16 import java.awt.geom.Area;

17 import java.awt.geom.RoundRectangle2D;

18 import java.awt.image.BufferedImage;

19 import java.io.File;

20 import java.io.FileOutputStream;

21 import java.io.IOException;

22 import javax.imageio.ImageIO;

23

24 /**

25 *

26 * @author sanshizi

27 */

28 public class ImageUtil {

29

30 /**

31 * 针对高度与宽度进行等比缩放

32 *

33 * @param img

34 * @param maxSize 要缩放到的尺寸

35 * @param type 1:高度与宽度的最大值为maxSize进行等比缩放 , 2:高度与宽度的最小值为maxSize进行等比缩放

36 * @return

37 */

38 private static Image getScaledImage(BufferedImage img, int maxSize, int type) {

39 int w0 = img.getWidth();

40 int h0 = img.getHeight();

41 int w = w0;

42 int h = h0;

43 if (type == 1) {

44 w = w0 > h0 ? maxSize : (maxSize * w0 / h0);

45 h = w0 > h0 ? (maxSize * h0 / w0) : maxSize;

46 } else if (type == 2) {

47 w = w0 > h0 ? (maxSize * w0 / h0) : maxSize;

48 h = w0 > h0 ? maxSize : (maxSize * h0 / w0);

49 }

50 Image image = img.getScaledInstance(w, h, Image.SCALE_SMOOTH);

51 BufferedImage result = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

52 Graphics2D g = result.createGraphics();

53 g.drawImage(image, 0, 0, null);//在适当的位置画出

54 return result;

55 }

56

57 /**

58 * 先按最小宽高为size等比例绽放, 然后图像居中抠出直径为size的圆形图像

59 *

60 * @param img

61 * @param size

62 * @return

63 */

64 private static BufferedImage getRoundedImage(BufferedImage img, int size) {

65 return getRoundedImage(img, size, size / 2, 2);

66 }

67

68 /**

69 * 先按最小宽高为size等比例绽放, 然后图像居中抠出半径为radius的圆形图像

70 *

71 * @param img

72 * @param size 要缩放到的尺寸

73 * @param radius 圆角半径

74 * @param type 1:高度与宽度的最大值为maxSize进行等比缩放 , 2:高度与宽度的最小值为maxSize进行等比缩放

75 * @return

76 */

77 private static BufferedImage getRoundedImage(BufferedImage img, int size, int radius, int type) {

78

79 BufferedImage result = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);

80 Graphics2D g = result.createGraphics();

81

82 //先按最小宽高为size等比例绽放, 然后图像居中抠出直径为size的圆形图像

83 Image fixedImg = getScaledImage(img, size, type);

84 g.drawImage(fixedImg, (size - fixedImg.getWidth(null)) / 2, (size - fixedImg.getHeight(null)) / 2, null);//在适当的位置画出

85

86 //圆角

87 if (radius > 0) {

88 RoundRectangle2D round = new RoundRectangle2D.Double(0, 0, size, size, radius * 2, radius * 2);

89 Area clear = new Area(new Rectangle(0, 0, size, size));

90 clear.subtract(new Area(round));

91 g.setComposite(AlphaComposite.Clear);

92

93 //抗锯齿

94 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

95 g.fill(clear);

96 g.dispose();

97 }

98 return result;

99 }

100

101 /**

102 * 使用删除alpha值的方式去掉图像的alpha通道

103 *

104 * @param $image

105 * @return

106 */

107 protected static BufferedImage get24BitImage(BufferedImage $image) {

108 int __w = $image.getWidth();

109 int __h = $image.getHeight();

110 int[] __imgARGB = getRGBs($image.getRGB(0, 0, __w, __h, null, 0, __w));

111 BufferedImage __newImg = new BufferedImage(__w, __h, BufferedImage.TYPE_INT_RGB);

112 __newImg.setRGB(0, 0, __w, __h, __imgARGB, 0, __w);

113 return __newImg;

114 }

115

116 /**

117 * 使用绘制的方式去掉图像的alpha值

118 *

119 * @param $image

120 * @param $bgColor

121 * @return

122 */

123 protected static BufferedImage get24BitImage(BufferedImage $image, Color $bgColor) {

124 int $w = $image.getWidth();

125 int $h = $image.getHeight();

126 BufferedImage img = new BufferedImage($w, $h, BufferedImage.TYPE_INT_RGB);

127 Graphics2D g = img.createGraphics();

128 g.setColor($bgColor);

129 g.fillRect(0, 0, $w, $h);

130 g.drawRenderedImage($image, null);

131 g.dispose();

132 return img;

133 }

134

135 /**

136 * 将32位色彩转换成24位色彩(丢弃Alpha通道)

137 *

138 * @param $argb

139 * @return

140 */

141 public static int[] getRGBs(int[] $argb) {

142 int[] __rgbs = new int[$argb.length];

143 for (int i = 0; i < $argb.length; i++) {

144 __rgbs[i] = $argb[i] & 0xFFFFFF;

145 }

146 return __rgbs;

147 }

148

149 public static void toJPG(File img, File save, int size, int quality) throws IOException {

150 FileOutputStream out = new FileOutputStream(save);

151 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);

152

153 BufferedImage image = (BufferedImage) getRoundedImage(ImageIO.read(img), size, 0, 2);//默认无圆角

154

155 //如果图像是透明的,就丢弃Alpha通道

156 if (image.getTransparency() == Transparency.TRANSLUCENT) {

157 image = get24BitImage(image);

158 }

159

160 JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);//使用jpeg编码器

161 param.setQuality(1, true);//高质量jpg图片输出

162 encoder.encode(image, param);

163

164 out.close();

165 }

166

167 public static void toPNG(File img, File save, int size) throws IOException {

168 ImageIO.write((BufferedImage) getRoundedImage(ImageIO.read(img), size, 0, 2), "PNG", save);//默认无圆角

169 }

170

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

172 File img = new File("e:\\Users\\rocky\\Desktop\\0\\IMG_0404.PNG");

173 File save = new File("e:\\Users\\rocky\\Desktop\\0\\zz.jpg");

174

175 toJPG(img, save, 250, 100);

176 }

177 }

以上是 java 图片处理 的全部内容, 来源链接: utcz.com/z/390102.html

回到顶部