ホームページ  >  記事  >  Java  >  画像の拡大縮小、切り取り、型変換、透かしなどの機能をJavaで実装する方法を詳しく解説

画像の拡大縮小、切り取り、型変換、透かしなどの機能をJavaで実装する方法を詳しく解説

巴扎黑
巴扎黑オリジナル
2017-08-01 11:36:241679ブラウズ

次の一般的な機能を実現できます: 画像の拡大縮小、画像の切り取り、画像タイプの変換、カラーから白黒への変換、テキストの透かし、画像の透かしなど

コードは次のとおりです コードをコピーします
import java.awt.AlphaComposite ;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import 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 管理者
*/
public class ImageUtils {

/**
* いくつかの一般的な画像形式
*/
public static String IMAGE_TYPE_GIF = "gif";// Graphics Interchange Format
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 ‐ ‑ ‐‑‑‐ 画像を次のように拡大縮小します:
- 高さと幅で拡大縮小します
ImageUtils.scale2(" e:/abc.jpg "、" "" e:/abc_scale2.jpg "、500、300、true); ///2-カット画像:sper 'ceoopce'cecerceceps togetherceps togetherceps togethercembcececece rightce rightomp rightce rightomp right right-‐‐‐‐out‐‐outir‐to‐outir‐thir's-thirty-thirst ); // テスト OK
// 方法 2 : スライスの行数と列数を指定します
ImageUtils.cut2("e:/abc.jpg", "e:/", 2, 2 ); // テスト OK

// 方法 3: 幅と列を指定します。スライスの高さ

ImageUtils.cut3("e:/abc.jpg", "e:/", 300, 300 ); // テストOK


ImageUtils.convert("e:/abc.jpg", " GIF", "e:/abc_convert.gif");//テスト OK

ImageUtil s. /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);//テストOK

ImageUtils.pressText2("私も透かしテキストです", "e:/abc .jpg"、"e:/abc_pressText2.jpg" , "Heoldbody", 36, Color.white, 80, 0, 0, 0.5f); //テスト OK
.画像の透かし:

ImageUtils.pressImage("e:/abc2.jpg" , "e:/abc.jpg", "e:/abc_pressImage.jpg", 0, 0, 0.5f);// テスト OK

}

/**
*画像をスケーリングします(比例してスケーリング) - 使用して使用を使用します - */
publicfinal static voidscale(String srcImageFile, String result,
intscale, boolean flag) {
try {
BufferedImage src = ImageIO.read(new File(srcImageFile)); // 读入文件
int width = src.getWidth(); // 得得源图宽
int height = src.getHeight(); // 得源图长
if (フラグ) {// 放大
width = width *scale;
height = height *scale;
} else {//幅 = 幅 / スケール;
高さ = 高さ / スケール;
}
画像 image = src.getScaledInstance(width, height,
Image.SCALE_DEFAULT);
BufferedImage タグ = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
グラフィック g = tag.getGraphics();
g. drawImage(画像, 0, 0, null); // 绘制缩小后的图
g.dispose();
ImageIO.write(tag, "JPEG", new File(result));// 输出文件流
} catch (IOException e) {
e.プリントスタックトレース();
}
}

/**
* スケーリングされた画像 (高さと幅によってスケーリング)
* @param srcImageFile ソース画像ファイルのアドレス
* @param result スケーリングされた画像のアドレス
* @param height スケーリングされた画像の高さ
* @param width スケーリングされた幅
* @param bb フィラーかどうか比率が間違っている場合に必要です。 true はフィラーを意味し、 false はフィラーなしを意味します。*/
publicfinal static voidscale2(String srcImageFile, String result, int height, int width, boolean bb) {
try {
double rate = 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()) {
rate = (new Integer(height) ).doubleValue()
/ bi.getHeight();
} else {
rate = (new Integer(width)).doubleValue() / bi.getWidth();
}
AffineTransformOp op = new AffineTransformOp(AffineTransform
. getScaleInstance(ratio, rate), null);
itemp = op.filter(bi, null);
}
if (bb) {//补白
BufferedImage image = new 、高さ、
BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, width, height);
if (width == itemp.getWidth(null))
g. drawImage(item, 0, (height - itemp.getHeight(null)) / 2,
itemp.getWidth(null), itemp.getHeight(null),
Color.white, null);
else
g.drawImage(itemp , (width - 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();
}
}

/**
座標Y
* @param width ターゲットスライス幅
* @param height ターゲットスライス高さ
*/
publicfinal static void Cut(String srcImageFile, String result,
int x, int y, int width, int height) {
try {
//读取源画像
BufferedImage bi = ImageIO.read(new File(srcImageFile));
int srcWidth = bi.getHeight(); // 源图宽度
int srcHeight = bi.getWidth(); // 源图高さ
if (srcWidth > 0 && srcHeight > 0) {
画像 image = bi.getScaledInstance(srcWidth, srcHeight,
Image.SCALE_DE FAULT);
// 4 つのパラメータ分割は画像起点座標标和宽高
// 略称: CropImageFilter(int x,int y,int width,int height)
ImageFilter CropFilter = new CropImageFilter(x, y, width, height);
Image img = Toolkit.getDefaultTool kit().createImage(
new FilteredImageSource(image.getSource(),
CropFilter));
BufferedImage タグ = new BufferedImage(width, height, 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();
}
}

/**
* 画像切割(指定切片の行数和列数)
* @param srcImageFile ソース画像地址
* @param descDir目标文件夹
* @param rows 2 は範囲 [1, 20] 以内である必要があります
* @param cols スライス対象の列の数。デフォルトは 2、[1, 20] の範囲内である必要があります。行> 20) rows = 2; // スライス行数
using use using using using use using using using ‐ out out out of の の へuse ‐ ‐ ‐ ‐ File(srcImageFile));
int srcWidth = bi.getHeight(); // ソース画像の幅
int srcHeight = bi.getWidth(); // ソース画像の高さ
if (srcWidth > 0 && srcHeight) &g t; ​​0) {
Image img; //各スライスの幅
/ / 各スライスの幅 高さ
} else {
destWidth = (int) Math.floor (srcWidth / 列数) + 1;
}
ight = (int) Math.floor(srcWidth / rows) 1;
/改善案: (int i = 0 の場合、マルチスレッドを使用して切断を高速化できますか?) ; i パラメータは画像の開始点の座標と幅の高さです //: CropImageFilter (int x, int y, int width, int height)
CropFilter = new CropImageFilter (J * Destwidth, I * DESTHEIGHT 、
DestWidth、Destheight);
IMG = Toolkit.getDefaultToolkit().createImage(
new filteredimagesource(image.getSource()、destheight、0、null);

/**
*画像切断(スライスの幅と高さを指定)
。デフォルトは 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; // スライスの高さ
ソース画像を読む
BufferedImage bi = ImageIO.read(new File(srcImageFile)); 画像の幅 int srcHeight = bi.getWidth();高さ
use using using srcHeight の s srcHeight の s srcHe t d- srcHe t t d srcHeight = bi.getWidth(); // ソース画像の高さ
ImageFilter CropFilter;
画像 image = bi.getScaledInstance(srcWidth, SrCheight_default);高さ)
CropFilter = 新しい CropimageFilter (J * Destwidth、I * Destheight、
destWidth, destHeight);
img = Toolkit.getDefaultToolkit().createImage(
new filteredimagesource(image.getSource()、destheight、0、null);

/**
* 图像类型转换: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();
        }
    }

/**
* カラーを白黒に変換します
* @param srcImageFile ソース画像アドレス
* @param destImageFile 宛先画像アドレス
*/
publicfinal static void grey(String srcImageFile, String destImageFile) {
try {
BufferedImage src = ImageIO.read(new File(srcImageFile));
ColorSpace cs = ance(色空間.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs, null);
src = op.filter(src, null);
ImageIO.write(src, "JPEG", new File(destImageFile));
}キャッチ( IOException e) {
e.printStackTrace();
}
}

/**
フォントスタイル
* @param color ウォーターマークのフォントの色
* @param fontSize ウォーターマークのフォントサイズ
* @param x 補正値
* @param y 補正値
* @param alpha 透明度: アルファは以内である必要があります範囲 [0.0, 1.0] (境界値を含む)) 浮動小数点数
*/
publicfinal static void pressText(String pressText,
String srcImageFile, String destImageFile, String fontName,
int fontStyle, Color color, int fontSize,int x,
int y, float alpha) {
{
File img = new File(srcImageFile);
Image src = ImageIO.read(img);
in t幅 = src.getWidth(null) ;
int height = src.getHeight(null);
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.create Graphics();
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() ;
ImageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));// 文件流
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 画像にテキスト透かしを追加します
* @param pressText 透かしテキスト
* @param srcImageFile ソース画像アドレス
* @param destImageFile 宛先画像アドレス
* @param fontName フォント名
* @param fontStyle フォント スタイル
*色フォントカラー
* @param fontsizeフォントサイズ*/
publicfinal static void pressText2(String pressText, String srcImageFile,String destImageFile,
String fontName, int fontStyle, Color color, int fontSize, int x,
int y, float alpha) {
{
ファイル img = new File(srcImageFile);
画像 src = ImageIO.read(img);
int width = src.getWidth(null);
int height =
BufferedImage 画像 = 新しいBufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
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,
alpha));
// 指定座標标绘制水印文字
g.drawString(pressText, (width - (getLength(pressText) * fontSize))
/ 2 + x, (height - fontSize) / 2 + y);
g.dispose();
ImageIO.write((BufferedImage) image, "JPEG", new File (destImageFile));
} catch (例外 e) {
e.printStackTrace();
}
}

/**
* 画像のウォーターマークを画像に追加します
* @param pressImg ウォーターマーク画像use using '''' '' ‐ ‐ ‐ ‐ ‐ ‐ ‐ � デフォルトは真ん中です
* @param yの補正値。 デフォルトは中央です
* @param alpha 透明度: alpha は範囲 [0.0, 1.0] (境界値を含む) 内の浮動小数点数でなければなりません
*/
publicfinal static void pressImage(String pressImg, String srcImageFile,String destImageFile,
int x, int y, float alpha) {
try {
File img = new File(srcImageFile);
画像 src = ImageIO.read(img);
int width = src.getWidth(null);
int height = src.getHeight(null);
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.drawImage(src, 0, 0, width, height, null);
// 水印文件
画像 src_biao = ImageIO.read(new File(pressImg));
int width_biao = src_biao.getWidth(null);
int height_biao = src_biao.getHeight(null);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha) );
g.drawImage(src_biao, (width - width_biao) / 2,
(height - height_biao) / 2, width_biao, height_biao, null);
// 水印文件结束
g.dispose();
edImage) 画像、「JPEG」、新しいファイル(destImageFile) );
} catch (例外 e) {
e.printStackTrace();
}
}

/**
* テキストの長さを計算します(漢字 1 文字は 2 文字としてカウントされます)

* @param text

* @return
*/
publicfinal static int getLength(String text) {
int長さ = 0;
の場合(int i = 0;私は< text.length(); i++) {
if (new String(text.charAt(i) + "").getBytes().length > 1) {
length += 2;
} else {
length += 1;
}
}
戻り値の長さ / 2;
}
}

以上が画像の拡大縮小、切り取り、型変換、透かしなどの機能をJavaで実装する方法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。