当前位置: 首页 > news >正文

Java语言对于图片与数组的相互转换操作

  1. 图片转字节数组,带有格式的(即包含头部格式部分)
    1. public static byte[] imageToByteArray(BufferedImage image, String format) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 将图像以指定格式(如 "png", "jpg")写入字节流 ImageIO.write(image, format, baos); // 从流中获取完整的字节数组 return baos.toByteArray(); }
  2. 字节数组转图片,带有格式的
    1. public static BufferedImage byteArrayToImage(byte[] imageBytes) throws IOException { // 将字节数组包装为输入流 ByteArrayInputStream bais = new ByteArrayInputStream(imageBytes); // 读取并解码为 BufferedImage return ImageIO.read(bais); }
  3. 获取具体的每个像素值,明了但低效的方式
    1. public int[][] getPixelArraySlow(BufferedImage image) { int width = image.getWidth(); int height = image.getHeight(); int[][] result = new int[height][width]; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { // 获取每个像素的ARGB值,组合成一个int result[row][col] = image.getRGB(col, row); } } return result; }

直接从DataBuffer获取(高效)
对于性能敏感的应用,直接读取图像的数据缓冲区是更好的选择。需要注意区分图像是否包含Alpha通道

public int[][] getPixelArrayFast(BufferedImage image) { // 直接从Raster获取底层字节数据 byte[] pixelData = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); int width = image.getWidth(); int height = image.getHeight(); boolean hasAlphaChannel = image.getAlphaRaster() != null; int[][] result = new int[height][width]; int pixelIndex = 0; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { int argb = 0; if (hasAlphaChannel) { // 数据顺序通常为: 蓝, 绿, 红, 阿尔法 argb = (((int) pixelData[pixelIndex + 3] & 0xff) << 24) | // Alpha (((int) pixelData[pixelIndex + 2] & 0xff) << 16) | // Red (((int) pixelData[pixelIndex + 1] & 0xff) << 8) | // Green ((int) pixelData[pixelIndex] & 0xff); // Blue pixelIndex += 4; } else { // 无Alpha通道,数据顺序为: 蓝, 绿, 红 argb = (0xff << 24) | // 完全不透明 (((int) pixelData[pixelIndex + 2] & 0xff) << 16) | // Red (((int) pixelData[pixelIndex + 1] & 0xff) << 8) | // Green ((int) pixelData[pixelIndex] & 0xff); // Blue pixelIndex += 3; } result[row][col] = argb; } } return result; }
从像素数组创建BufferedImage

这是逆向过程,最常用setRGB()方法,它接受一个一维数组

public BufferedImage createImageFromArray(int[] pixels, int width, int height) { // 创建一个指定尺寸和类型的RGB图像 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 将像素数组一次性设置到图像中 image.setRGB(0, 0, width, height, pixels, 0, width); return image; }
http://www.cnnetsun.cn/news/3617818.html

相关文章:

  • 700亿流量架构:边缘计算与实时推荐的技术突破
  • Kubernetes 1.33.3部署Nginx边缘网关实战指南
  • 3D目标检测技术:多模态融合与工程实践
  • 解决d3dx9_30.dll缺失问题的安全方案
  • AI原生应用中的A/B测试优化实践与案例分析
  • 前端集成AI绘图的风险与防护实践
  • Web逆向实战:Python复现抖音bd-ticket-guard-client-data加密参数
  • TI AM572x VIP接口时序配置与手动IO延迟调试实战
  • AI小说生成API测评与优化实战指南
  • 基于多光谱成像与YOLOv26的焊缝缺陷智能检测系统
  • MSP430FR599x外设深度解析:LEA、ADC12_B与FRAM实战指南
  • 马文·明斯基:人工智能先驱与框架理论革命
  • 【面试题】AI测试面试题1
  • ADS8598H高精度多通道数据采集系统:过采样原理与电力自动化应用
  • 程序员必备:大模型扩展技能实战指南
  • MCP协议:AI编程工程化的关键技术解析
  • UnrealCLR动态加载与热重载:提升UE5 C#开发效率的核心技术
  • AI技术应用现状与行业落地实践深度解析
  • AI代码助手与CRITIC认知架构的融合实践
  • 互补强化学习:双系统架构提升LLM训练效率
  • C++矩阵运算库实战:从零实现高性能矩阵运算库
  • Pi coding agent模型选择指南:从场景需求到工程化实践
  • 《技术大败局》新能源汽车篇(更新2)
  • 苏州集群注册地址挂靠和园区地址有什么区别?
  • 深度学习模型推理加速:混合精度与算子融合技术详解
  • 前端提效神器|小米 HiUI 5.0 一句话搞定中后台页面
  • DLP不连续模式调光:实现HUD与投影仪高动态范围无闪烁亮度控制
  • 超大规模AI模型分布式训练技术与优化实践
  • 专业AI机构技术架构与大模型实战应用解析
  • 马尔可夫过程在强化学习中的核心原理与实践技巧