>  기사  >  Java  >  Java의 이미지 스케일링, 자르기, 유형 변환, 워터마킹 및 기타 기능 구현에 대한 자세한 설명

Java의 이미지 스케일링, 자르기, 유형 변환, 워터마킹 및 기타 기능 구현에 대한 자세한 설명

巴扎黑
巴扎黑원래의
2017-08-01 11:36:241617검색

다음과 같은 일반적인 기능을 구현할 수 있습니다: 이미지 크기 조정, 이미지 자르기, 이미지 유형 변환, 흑백으로 색상, 텍스트 워터마크, 그림 워터마크 등

코드는 다음과 같습니다. 코드 복사
import java.awt.AlphaComposite ;
java.awt.Color 가져오기;
java.awt.Font 가져오기;
java.awt.Graphics 가져오기;
java.awt.Graphics2D 가져오기;
java.awt.Image 가져오기;
java.awt.Toolkit 가져오기;
import java.awt.color.ColorSpace;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.File;
import java.io.IOException;

import javax. imageio.ImageIO;

/**
* 이미지 처리 도구:

* 기능: 이미지 크기 조정, 이미지 자르기, 이미지 유형 변환, 색상을 흑백으로, 텍스트 워터마크, 그림 워터마크 등
* @author Administrator
*/
public class ImageUtils {

/**
   * 몇 가지 일반적인 이미지 형식
 */
public static String IMAGE_TYPE_GIF = "gif";// 그래픽 교환 형식
public static String IMAGE_TYPE_JPG = "jpg";// Joint Photographic Experts Group
Public static String IMAGE_TYPE_JPEG = "jpeg"; // Joint Photo Experts Group
public static String IMAGE_TYPE_BMP = "bmp" // 표준 이미지 파일 형식인 영문 비트맵(Bitmap)의 약어입니다. Windows 운영 체제에서
public static String IMAGE_TYPE_PNG = "png"; // 휴대용 네트워크 그래픽
public static String IMAGE_TYPE_PSD = "psd" // Photoshop의 특수 형식 Photoshop

/**
     * 프로그램 항목: 테스트용
     * @param args
   */
public static void main(String[] args) {
                                                                              사용   사용 사용 사용          사용 사용 ’ ’ s ’ s ‐ ‐ ‐‐‐‐‐ 이미지 크기를 다음과 같이 조정합니다.
​                                          테스트 확인
                                                                                  높이 및 너비 사용            사용 사용 사용  ‐                                       사용 사용 사용 사용 using out out out out out out out out out out out out out out out out out 의            . / 2-이미지 자르기:
                                                                              ‐                                                                              에 따라 잘라냅니다. 지정된 시작점 좌표와 너비 및 높이
        ImageUtils .cut("e:/abc.jpg", "e:/abc_cut.jpg", 0, 0, 400, 400 ); // 테스트 OK

// 방법 2: 슬라이스의 행과 열 수를 지정합니다.

ImageUtils.cut2("e:/abc.jpg", "e:/", 2, 2 ); // 테스트 OK
// 방법 3: 슬라이스의 너비와 높이 지정
          ImageUtils.cut3("e :/abc.jpg", "e:/", 300, 300 ); // 테스트 확인

                                                            T Imageutils.convert ("E: /abc.jpg", "GIF ", "E: /abc_convert.gif" ); // 테스트 ok

// 4색을 흑백으로:

Imageutils.gray ("E: E: /abc.jpg "," e: /abc_gray.jpg ") // 테스트 OK


// 5- 그림에 텍스트 워터마크 추가:

// 방법 1:

imageutils.pressterxt (" 나는 워터마크 텍스트입니다 ", "e:/abc.jpg","e:/abc_pressText.jpg","宋体",Font.BOLD,Color.white,80, 0, 0, 0.5f);//테스트 확인
                                                         .

    ImageUtils.pressText 2("나도 워터마크 텍스트입니다", "e:/abc.jpg", " e:/abc_pressText2.jpg", "Heoldbody", 36, Color.white, 80, 0, 0, 0.5f); //테스트 OK

                                              ~  // 6-사진에 이미지 워터마크 추가:
          ImageUtils.pressImage(" e:/abc2.jpg", "e:/abc.jpg", "e:/abc_pressImage.jpg", 0, 0, 0.5f);//테스트 OK
}

    /**
              * 이미지 크기 조절(비율에 따라 크기 조절)
                                                                                                             사용   사용 사용  -                                                                              */
    public final static void scale(String srcImageFile, String result,
            int scale, boolean flag) {
        시도 {
           BufferedImage src = ImageIO.read(new File(srcImageFile)); // 读入文件
            int width = src.getWidth(); // 得到源图宽
            int height = src.getHeight(); // 得到源图长
            if (플래그) {// 放大
               width = width * scale;
               height = height * scale;
           } else {// 缩小
               너비 = 너비 / 배율;
                높이 = 높이 / 배율;
          }
            이미지 이미지 = src.getScaledInstance(width, height,
                  Image.SCALE_DEFAULT);
                            BufferedImage.TYPE_INT_RGB);
            그래픽 g = tag.getGraphics();
            g. drawImage(이미지, 0, 0, null); // 绘          g.dispose();
            ImageIO.write(tag, "JPEG", new File(result));// 输 Out文件流
       } catch (IOException e) {🜜           e.printStackTrace ();
        }
    }

    /**image * 이미지 크기 조정 (높이 및 너비 확대)
* @Param srcimageFile 원본 이미지 파일 주소
@param result
* @Param Height 높이





@ @












@ @ @ @ @ @ @ @ @ @ @ @ @ @@Param 너비가 확대됩니다. @param bb 비율이 잘못된 경우 필러가 필요한지 여부: true는 필러가 없음을 의미합니다.*/
    public final static void scale2(String srcImageFile, String result, int height, int width, boolean bb) {
        시도해 보세요 {
            double ratio = 0.0; // 缩放比例
            File f = new File(srcImageFile);
            BufferedImage bi = ImageIO.read(f);
           Image itemp = bi.getScaledInstance(width, height, bi.SCALE_SMOOTH);
            // 计算比例
            if ( (bi.getHeight() > 높이) || (bi.getWidth() > 너비)) {
               if (bi.getHeight() > bi.getWidth()) {
                  ratio = (new Integer(height) ).doubleValue()
                          / bi.getHeight();
              } else {
                 ratio = (new Integer(width)).doubleValue() / bi.getWidth();
               }
                AffineTransformOp op = new AffineTransformOp(AffineTransform
                      . getScaleInstance(ratio, ratio), null);
               itemp = op.filter(bi, null);
            }🎜            if (bb) {//补白🎜           BufferedImage image = new BufferedImage(width, height, 🎜                       BufferedImage.TYPE_INT_RGB); 🎜               Graphics2D g = image.createGraphics();🎜               g.setColor(Color.white);🎜              g.fillRect(0, 0, 너비, 높이);🎜               if (폭 == itemp.getWidth(null))🎜                    g. drawImage(item, 0, (높이 - itemp.getHeight(null)) / 2,🎜                          itemp.getWidth(null), itemp.getHeight(null),🎜                          Color.white, null); 🎜               else🎜                   g.drawImage(item , (너비 - itemp.getWidth(null)) / 2, 0,🎜                           itemp.getWidth(null), itemp.getHeight(null),🎜                         Color.white, null);🎜                g.dispose();
                itemp = image;
            }
            ImageIO.write((BufferedImage) itemp, "JPEG", new File(result));
        } catch (IOException e) {🜜           e.printStackTrace();
}#取源图상
            BufferedImage bi = ImageIO.read(new File(srcImageFile));
            int srcWidth = bi.getHeight(); // 源图宽degree
            int srcHeight = bi.getWidth(); // 源图고도
            if (srcWidth > 0 && srcHeight > 0) {
              이미지 이미지 = bi.getScaledInstance(srcWidth, srcHeight,
                      Image.S CALE_DEFAULT);
                // 4个参数分别为图image起点坐标和宽高
               // 即: CropImageFilter(int x,int y,int width,int height)
              ImageFilter CropFilter = new CropImageFilter(x, y, width, height);
               Image img = Toolkit.getDefaultToolkit ().createImage(
                        신규 FilteredImageSource(image.getSource(),
                             cropFilter));
               BufferedImage 태그 = new BufferedImage(너비, 높이, BufferedImage.TYPE_INT_RGB);
               그래픽 g = tag.getGraphics();
                g.drawImage(img, 0, 0, 너비, 높이, null); // 绘切后的图
               g.dispose();
              // 输 为文件
              ImageIO.write(tag, "JPEG", new File(result));
            }
        } catch(예외 e) {
            e .printStackTrace();
        }
    }
   
    /**
     * 图image切割(指定切 Images 行数 列数)
     * @param srcImageFile 源图地址
     * @param descDir 切文目标文件夹
     * @param 행目标切分行数。默认2,必须是范围 [1, 20] 之内
* @param cols 대상 슬라이싱 열 수입니다. 기본값 2, [1, 20] 범위 내에 있어야 합니다.
                                                                         | 행 = 2; // 분할 행 수
                                                                                                         사용 사용 사용 사용 사용         사용 사용 사용 사용 ‐     out out of 's to use ‐ ‐ ‐      File(srcImageFile));
int srcWidth = bi.getHeight(); // 소스 이미지 너비
int srcHeight = bi.getWidth() // 소스 이미지 높이
if (srcWidth > 0 && srcHeight &g t; 0) {
           이미지 img; int destWidth = srcWidth;                                        int destHeight = srcHeight; // 각 슬라이스의 너비 Height
                                                                                                                                    } else {                     destWidth = (int) Math.floor (srcWidth / cols) + 1;
}
                                                                                  ight = (int) Math.floor(srcWidth / 행) + 1;
                                                                                                                                 /개선 아이디어: (int i = 0에 대해 멀티스레딩을 사용하여 속도를 높일 수 있습니까? ; i < 행 i++) {
매개변수는 이미지 시작점 좌표와 넓은 높이입니다. //: CropImageFilter (int x, int y, int width, int height)
CropFilter = New CropimageFilter (J * Destwidth, I * Destheight ,
DestWidth, Destheight)
IMG = Toolkit.getDefaultToolkit().createImage(
새로운 FilteredImageSource(image.getSource(),                                                                                ~ ~ | ~ ~                         " + j + ".jpg")
                                                                         

/**
        * 이미지 자르기(슬라이스의 너비와 높이 지정)
                                                                                 > 기본값 200
* @param destHeight 대상 슬라이스 높이. 기본값 150
*/
public final static void cut3(String srcImageFile, String descDir,
int destWidth, int destHeight) {
try {
if(destWidth<=0) = 200 // 슬라이스 너비
if (destHeight<=0) destHeight = 150; // 슬라이스 높이
                                                                    > 파일)); 이미지 너비
          int srcHeight = bi.getWidth(); 높이
                                                srcHeight를 사용하여 사용       srcHeight를 사용하여 사용   을 통해 밖으로  ‐     ‐     ImageFilter CropFilter;
           이미지 이미지 = bi.getScaledInstance(srcWidth, srcHeight , Image.SCALE_DEFAULT) if (srcWidth % destWidth == 0) {
cols = srcWidth / destWidth;
                                                                                ~ ~ ~ > >         ; 행; i++) {
  mageFilter(int x,int y,int width, int height)
CropFilter = New CropimageFilter (J * Destwidth, I * Destheight,
destWidth, destHeight);
img = Toolkit.getDefaultToolkit().createImage(
새로운 FilteredImageSource(image.getSource(),                                                                                ~ ~ | ~ ~                         " + j + ".jpg")
                                                                         

/**
* 图像类型转换:GIF->JPG、GIF->PNG、PNG->JPG、PNG->GIF(X)、BMP->PNG
     * @param srcImageFile 源图像地址
     * @param formatName 包含格式非正式名称的 String:如JPG、JPEG、GIF等
     * @param destImageFile 目标图像地址
     */
    public final static void convert(String srcImageFile, String formatName, String destImageFile) {
        try {
            File f = new File(srcImageFile);
            f.canRead();
            f.canWrite();
            BufferedImage src = ImageIO.read(f);
            ImageIO.write(src, formatName, new File(destImageFile));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

_ ... IOException e) {

            e.printStackTrace();
        }
    }

    /**
      * 색상을 흑백으로 변환
     * @param srcImageFile 소스 이미지 주소
     * @param destImageFile 대상 이미지 주소
   */
    public final static void pressText(String pressText,
            String srcImageFile, String destImageFile, String FontName,
            int 글꼴스타일, 색상 color, intfontSize,int x,
            int y, float alpha) {
        시도 {
            File img = new File(srcImageFile);
          Image src = ImageIO.read(img);

            int 너비 = src.getWidth(null) ;

            int height = src.getHeight(null);
            BufferedImage 이미지 = new BufferedImage(폭, 높이,
                 BufferedImage.TYPE_INT_RGB);
            Graphics2D g = image.create 그래픽();
            g.drawImage(src, 0, 0, width, height, null);
            g.setColor(color);
            g.setFont(new Font(fontName,fontStyle,fontSize));
           g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
                    알파));
// 在指定坐标绘绘文字
            g.drawString(pressText, (width - (getLength(pressText) *fontSize))
                 / 2 + x, (height -fontSize) / 2 + y);
            g.dispose() ;???? }
_ {

            File img = new File(srcImageFile);
            Image src = ImageIO.read(img);
           int width = src.getWidth(null);
            int height = src.getHeight(null);
            BufferedImage 이미지 = 신규 BufferedImage(너비, 높이,
                   BufferedImage.TYPE_INT_RGB);
            Graphics2D g = image.createGraphics();
            g.drawImage(src, 0, 0, 너비, 높이, null);
            g.setColor(color);
            g .setFont(new Font(fontName,fontStyle,fontSize));
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
                  alpha));
            // 재정정坐标绘제한수印文字
            g.drawString(pressText, (너비 - (getLength(pressText) *fontSize))
                  / 2 + x, (height -fontSize) / 2 + y);
            g.dispose();
            ImageIO.write((BufferedImage) image, "JPEG", 새 파일 (destImageFile));
        } catch (예외 e) {
            e.printStackTrace();
        }
    }

    /**
          * 사진에 이미지 워터마크 추가
          * @param pressImg 워터마크 이미지
                                                                       다음을 사용하여 사용  -                                         기본값은 중간입니다.
* @param y 보정 값입니다. 기본값은 중간입니다.
* @param 알파 투명도: 알파는 [0.0, 1.0] 범위(경계 값 포함) 내의 부동 소수점 숫자여야 합니다.
*/
    public final static void pressImage(String pressImg, String srcImageFile,String destImageFile,
            int x, int y, float alpha) {
        시도 {
            File img = new File(srcImageFile);
Image src = ImageIO.read(img);
            int wideth = src.getWidth(null);
           int height = src.getHeight(null);
           BufferedImage image = new BufferedImage(wideth, height,
                    BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
           g.drawImage(src, 0, 0, wideth, height, null);
            // 水印文件
           Image src_biao = ImageIO.read(new File(pressImg));
            int wideth_biao = src_biao.getWidth(null);
            int height_biao = src_biao.getHeight(null);
           g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
                  알파) );
            g.drawImage(src_biao, (wideth - wideth_biao) / 2,
                   (height - height_biao) / 2, wideth_biao, height_biao, null);
            // 水印文件结束
            g.dispose();
            ImageIO .write((BufferedImage) 이미지,  "JPEG", 새 파일(destImageFile) );
        } catch(예외 e) {
            e.printStackTrace();
        }
    }

    /**

       * 텍스트 길이 계산(한자 1자는 2자로 계산)

        * @param text
         * @return
    */
    public final static int getLength(String text) {
        int length = 0;
       (int i = 0; 나는 < 텍스트.길이(); i++) {
            if (new String(text.charAt(i) + "").getBytes().length > 1) {
               길이 += 2;
           } else {
                길이 += 1;
            }
        }
        반환 길이 / 2;
    }
}

위 내용은 Java의 이미지 스케일링, 자르기, 유형 변환, 워터마킹 및 기타 기능 구현에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.