java imageinputstream 转 image_图片转字符图片(一)

序言

这个是从抖音上学来的,一开始刷抖音,遇到不少字符串跳舞的视频,因此来实践一下

主要分为三个部分

  1. 静态图片转静态图片
  2. gif转gif
  3. 视频转视频

静态图片转静态图片

其实原理很简单,读取图片的像素,新建一张大小一样的图片,根据原图像素的灰度,决定是不是要显示出来,并在新图相应的位置添加字符,这样就完成了

先来看下效果图,如下

2946569ab37b7e3b1d4fcf9ea72504dc.png
098d20ac8d875cd6c114cd1e641a8cc5.png

代码实现

借助前辈写的工具,主要包含一下四个类:AnimatedGifEncoderGifDecoderLZWEncoderNeuQuant

源地址:https://github.com/rtyley/animated-gif-lib-for-java

ps: 网上各种版本的太多,不清楚这个是不是原作者,github上搜GifDecoder

环境:

JDK 1.8

注:Java原生代码实现使

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要判断图片是否旋,可以通过读取图片的 Exif 信息来获取图片的朝向。Exif 是一种存储在 JPG、TIFF、RAW 等格式的照片中的元数据,其中包含了拍摄时的时间、地点、相机型号等信息,还包括图片的朝向。 Java 中可以使用 ImageIO 类读取图片的 Exif 信息,代码如下: ``` File file = new File("image.jpg"); ImageInputStream input = ImageIO.createImageInputStream(file); Iterator<ImageReader> readers = ImageIO.getImageReaders(input); if (readers.hasNext()) { ImageReader reader = readers.next(); reader.setInput(input); IIOMetadata metadata = reader.getImageMetadata(0); Node root = metadata.getAsTree(metadata.getNativeMetadataFormatName()); Node orientationNode = findOrientationNode(root); int orientation = getOrientation(orientationNode); System.out.println("图片朝向:" + orientation); } ``` 其中,`findOrientationNode` 和 `getOrientation` 方法分别用于查找朝向节点和获取朝向值,代码如下: ``` private static Node findOrientationNode(Node root) { Node orientationNode = null; NodeList nodeList = root.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if ("{http://ns.adobe.com/exif/1.0/}IFD".equals(node.getNodeName())) { orientationNode = findOrientationNode(node); if (orientationNode == null) { NamedNodeMap attributes = node.getAttributes(); if (attributes != null) { orientationNode = attributes.getNamedItem("Orientation"); } } break; } } return orientationNode; } private static int getOrientation(Node orientationNode) { if (orientationNode == null) { return 1; } String value = orientationNode.getNodeValue(); if (value == null) { return 1; } return Integer.parseInt(value); } ``` 如果图片的朝向不是默认的 1,就需要将图片到正确的方向。可以使用 Java 的 AffineTransform 类来进行图片,代码如下: ``` File file = new File("image.jpg"); ImageInputStream input = ImageIO.createImageInputStream(file); BufferedImage image = ImageIO.read(input); int orientation = getOrientation(findOrientationNode(root)); AffineTransform transform = new AffineTransform(); switch (orientation) { case 2: transform.scale(-1.0, 1.0); transform.translate(-image.getWidth(), 0); break; case 3: transform.translate(image.getWidth(), image.getHeight()); transform.rotate(Math.PI); break; case 4: transform.scale(1.0, -1.0); transform.translate(0, -image.getHeight()); break; case 5: transform.rotate(Math.PI / 2); transform.scale(-1.0, 1.0); break; case 6: transform.rotate(Math.PI / 2); transform.translate(0, -image.getHeight()); break; case 7: transform.rotate(-Math.PI / 2); transform.scale(-1.0, 1.0); transform.translate(-image.getHeight(), 0); break; case 8: transform.rotate(-Math.PI / 2); transform.translate(-image.getWidth(), 0); break; } BufferedImage rotatedImage = new BufferedImage(image.getHeight(), image.getWidth(), image.getType()); Graphics2D g = rotatedImage.createGraphics(); g.setTransform(transform); g.drawImage(image, 0, 0, null); g.dispose(); ImageIO.write(rotatedImage, "jpg", new File("rotated.jpg")); ``` 其中,根据不同的朝向值,使用不同的变换矩阵来旋图片。最后使用 ImageIO 将旋后的图片保存到文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值