栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java

我只是在玩同一个主题,这是访问像素的最快方法。我目前知道执行此操作的两种方法:

使用

getRGB()@tskuzzy
的答案中所述的BufferedImage 方法。
通过直接使用以下方式访问像素数组:

byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();

如果你要处理大图像并且性能是一个问题,则第一种方法绝对不是可行的方法。该getRGB()方法将alpha,红色,绿色和蓝色的值合并为一个int,然后返回结果,在大多数情况下,你将进行相反操作以将这些值取回。

第二种方法将直接为每个像素返回红色,绿色和蓝色值,如果有alpha通道,它将添加alpha值。使用此方法在计算指标方面比较困难,但是比第一种方法要快得多。

在我的应用程序中,通过从第一种方法切换到第二种方法,我能够将像素处理时间减少90%以上!

这是我为比较两种方法而设置的比较:

import java.awt.image.BufferedImage;import java.awt.image.DataBufferByte;import java.io.IOException;import javax.imageio.ImageIO;public class PerformanceTest {   public static void main(String[] args) throws IOException {      BufferedImage hugeImage = ImageIO.read(PerformanceTest.class.getResource("12000x12000.jpg"));      System.out.println("Testing convertTo2DUsingGetRGB:");      for (int i = 0; i < 10; i++) {         long startTime = System.nanoTime();         int[][] result = convertTo2DUsingGetRGB(hugeImage);         long endTime = System.nanoTime();         System.out.println(String.format("%-2d: %s", (i + 1), toString(endTime - startTime)));      }      System.out.println("");      System.out.println("Testing convertTo2DWithoutUsingGetRGB:");      for (int i = 0; i < 10; i++) {         long startTime = System.nanoTime();         int[][] result = convertTo2DWithoutUsingGetRGB(hugeImage);         long endTime = System.nanoTime();         System.out.println(String.format("%-2d: %s", (i + 1), toString(endTime - startTime)));      }   }   private static int[][] convertTo2DUsingGetRGB(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++) { result[row][col] = image.getRGB(col, row);         }      }      return result;   }   private static int[][] convertTo2DWithoutUsingGetRGB(BufferedImage image) {      final byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();      final int width = image.getWidth();      final int height = image.getHeight();      final boolean hasAlphaChannel = image.getAlphaRaster() != null;      int[][] result = new int[height][width];      if (hasAlphaChannel) {         final int pixelLength = 4;         for (int pixel = 0, row = 0, col = 0; pixel + 3 < pixels.length; pixel += pixelLength) { int argb = 0; argb += (((int) pixels[pixel] & 0xff) << 24); // alpha argb += ((int) pixels[pixel + 1] & 0xff); // blue argb += (((int) pixels[pixel + 2] & 0xff) << 8); // green argb += (((int) pixels[pixel + 3] & 0xff) << 16); // red result[row][col] = argb; col++; if (col == width) {    col = 0;    row++; }         }      } else {         final int pixelLength = 3;         for (int pixel = 0, row = 0, col = 0; pixel + 2 < pixels.length; pixel += pixelLength) { int argb = 0; argb += -16777216; // 255 alpha argb += ((int) pixels[pixel] & 0xff); // blue argb += (((int) pixels[pixel + 1] & 0xff) << 8); // green argb += (((int) pixels[pixel + 2] & 0xff) << 16); // red result[row][col] = argb; col++; if (col == width) {    col = 0;    row++; }         }      }      return result;   }   private static String toString(long nanoSecs) {      int minutes    = (int) (nanoSecs / 60000000000.0);      int seconds    = (int) (nanoSecs / 1000000000.0)  - (minutes * 60);      int millisecs  = (int) ( ((nanoSecs / 1000000000.0) - (seconds + minutes * 60)) * 1000);      if (minutes == 0 && seconds == 0)         return millisecs + "ms";      else if (minutes == 0 && millisecs == 0)         return seconds + "s";      else if (seconds == 0 && millisecs == 0)         return minutes + "min";      else if (minutes == 0)         return seconds + "s " + millisecs + "ms";      else if (seconds == 0)         return minutes + "min " + millisecs + "ms";      else if (millisecs == 0)         return minutes + "min " + seconds + "s";      return minutes + "min " + seconds + "s " + millisecs + "ms";   }}

你能猜出输出吗?;)

Testing convertTo2DUsingGetRGB:1 : 16s 911ms2 : 16s 730ms3 : 16s 512ms4 : 16s 476ms5 : 16s 503ms6 : 16s 683ms7 : 16s 477ms8 : 16s 373ms9 : 16s 367ms10: 16s 446msTesting convertTo2DWithoutUsingGetRGB:1 : 1s 487ms2 : 1s 940ms3 : 1s 785ms4 : 1s 848ms5 : 1s 624ms6 : 2s 13ms7 : 1s 968ms8 : 1s 864ms9 : 1s 673ms10: 2s 86msBUILD SUCCESSFUL (total time: 3 minutes 10 seconds)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/378765.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号