コードを使用して、友達がP-pictureの問題を解決できるようにします

前に書く

この記事は2020年2月に私が書いたもので、私の個人ブログxeblog.cn/articles/32で最初に公開されました。

事件の原因:その時、友人から写真を送ってもらい、PにWeChatの支払いコードを渡そうと言ってPの写真を渡してほしいと言われたので、とてもおもしろいと思ったので渡してみました。 P、このPは手に負えないので、人々は毎日この写真をPにやってくる。

82a7bc0eff934ca69188b162d275ff94.gif

それについて考えた後、プログラマーを悩ませている問題は何ですか?コードを使って写真を合成するというアイデアを思いつきませんか、ハハハ〜

体験アドレス:xeblog.cn/tools/1.htm…

最初にWeChatに移動してWeChatコレクションコードを生成し(支払いを受け取る->QRコードコレクション->コレクションコードを保存する)、アップロードしてからデバイスを選択し、Androidフォン用Androidを選択し、Appleフォン用Appleを選択して最後にクリックします合成を開始するには以上です。

準備段階

元の画像(インターネットから)

image.png

PS処理後のテンプレートマップ

合成する画像

image.png

画像合成

基本的な手順

  • テンプレート画像と合成する画像を読み取り、合成する画像のサイズ、回転角、明るさ、コントラストを調整します。
  • テンプレート画像と同じサイズの空白の画像を作成します。
  • Graphics2Dオブジェクトを作成Graphics2D、objectdrawImage()メソッドを使用して、合成する画像とテンプレート画像を空白の画像の指定した位置に描画します(レイヤーの順序に注意し、最初に合成する画像を描画してから描画する必要があります)テンプレート画像);
  • 空白の画像(合成画像)をローカルに出力します。

コード

画像サイズの調整と回転が使用されThumbnailatorMaven依存関係

<dependency>
	<groupId>net.coobird</groupId>
	<artifactId>thumbnailator</artifactId>
	<version>0.4.8</version>
</dependency>
复制代码
/**
 * 横坐标
 */
private static final int x = 457;
/**
 * 纵坐标
 */
private static final int y = 295;
/**
 * 旋转角度
 */
private static final double angle = 16;
/**
 * 缩放比例
 */
private static final double scale = 0.18;

/**
 * 图片合成
 *
 * @param imagePath 待合成的图片路径
 * @param outPath 合成后的图片输出路径
 * @throws IOException
 */
private static void synthesis(String imagePath, String outPath) throws IOException {
	// 模板图
	BufferedImage template = ImageIO.read(new File("D:\\local\\images\\template.png"));
	// 待合成图
	BufferedImage image = ImageIO.read(new File(imagePath));
	// 调整待合成图的尺寸和旋转角度
	image = Thumbnails.of(image).scale(scale).rotate(angle).asBufferedImage();

	// 合成后的图
	BufferedImage result = new BufferedImage(template.getWidth(), template.getHeight(), template.getType());
	Graphics2D graphics2D = result.createGraphics();
	// 先画待合成图,后画模板图,这样就能将待合成图放置在模板图的下层
	graphics2D.drawImage(image, x, y, null);
	graphics2D.drawImage(template,0,0, null);
	graphics2D.dispose();

	ImageIO.write(result, "png", new File(outPath));
}
复制代码

コードを実行する

public static void main(String[] args) throws IOException {
	synthesis("D:\\local\\images\\weixin_payment_code.png", "D:\\local\\images\\result.png");
}
复制代码

image.png

画像の明るさとコントラストを調整する

/**
 * 调整亮度、对比度
 *
 * @param image
 */
private static void adjustBrightnessAndContrast(BufferedImage image) {
	int width = image.getWidth();
	int height = image.getHeight();
	for (int x = 0; x < width; x++) {
		for (int y = 0; y < height; y++) {
			Color color = new Color(image.getRGB(x, y));
			int red = calculateColor(color.getRed());
			int green = calculateColor(color.getGreen());
			int blue = calculateColor(color.getBlue());
			color = new Color(red, green, blue);
			image.setRGB(x, y, color.getRGB());
		}
	}
}

/**
 * 亮度,取值范围[-1,1]
 */
private static final double BRIGHTNESS = 0;
/**
 * 对比度,取值范围[-1,1]
 */
private static final double CONTRAST = -0.5;
		
/**
 * 计算亮度、对比度颜色值
 *
 * @param color 原颜色值
 * @return 返回计算后的颜色值
 */
private static int calculateColor(int color) {
	color = (int)((color - 127.5 * (1 - BRIGHTNESS)) * Math.tan((45 + 44 * CONTRAST) / 180 * Math.PI) + 127.5 * (1 + BRIGHTNESS));
	return getColor(color);
}

/**
 * 获取范围内的颜色值,[0,255]
 *
 * @param color
 * @return
 */
private static int getColor(int color) {
	return color > 255 ? 255 : color < 0 ? 0 : color;
}
复制代码

合成する画像のサイズと回転角度を処理した後、adjustBrightnessAndContrast()メソッドて明るさとコントラストを調整します

...
// 调整待合成图的尺寸和旋转角度
image = Thumbnails.of(image).scale(scale).rotate(angle).asBufferedImage();
// 调整待合成图片的亮度、对比度
adjustBrightnessAndContrast(image);
...
复制代码

コードを再実行します

image.png

体験アドレス:xeblog.cn/tools/1.htm…

詳しくは「クリエイティブデベロップメントコンテスト」に参加しています。こちらをご覧ください:ナゲッツクリエイティブデベロップメントコンテストはこちら!

おすすめ

転載: juejin.im/post/7122320376989745183