Java 数组副本排除每个x元素

Java 数组副本排除每个x元素,java,android,arrays,rgb,rgba,Java,Android,Arrays,Rgb,Rgba,我正在将RGBA图像转换为RGB。使用原始数组复制: for (int j=0, i=0; i<argbBytes.length; i++){ if (i%4 < 3) { thumbRGB888[j++] = argbBytes[i]; } } for(intj=0,i=0;i代替 if (i%4 < 3) if(i%4

我正在将RGBA图像转换为RGB。使用原始数组复制:

for (int j=0, i=0; i<argbBytes.length; i++){
    if (i%4 < 3) {
        thumbRGB888[j++] = argbBytes[i];
    }
}
for(intj=0,i=0;i代替

if (i%4 < 3)
if(i%4<3)


for(int j=0,i=0;i使用两个索引和
System.arraycopy()
,每次复制3个元素:

for (int i = 0, j = 0; i < argbBytes.length; i += 4, j += 3)
{
    System.arraycopy(argbBytes, i, thumbRGB888, j, 3);
}
for(int i=0,j=0;i

应该更快。它不仅摆脱了模和比较,
System.arraycopy()
是用本机代码实现的,依赖于
memcpy
,这将比单个赋值更快。

您应该避免使用
if
语句,它执行两个操作。
从i=0开始,i%4不是一个定义良好的答案,而是一个指针: 从未完成,且未完全满足您的要求,但将转换保留为。完全不确定,但:

使用BitmapFactory从字节中获取ARGB位图。如果不可变,则可能不会进行新的分配。也可能是,您首先需要将字节包装到缓冲区中

然后
Bitmap.copy
应该是可能的

一些疯狂的想法:

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inMutable = true; // Bitmap generated mutable.
opts.inPreferredConfig = Bitmap.Config.ARGB_8888; // I hope not BGRA.
Bitmap bmARGB = BitmapFactory.decodeByteArray(argbBytes, 0, argbBytes.length,
    opts);

bmARGB.setHasAlpha(false);

DisplayMetrics display = ...;
int[] colors = null; // Palette
Bitmap bmRGB = bmARBG.createBitmap(display, colors, width, height,
    Bitmap.Config.RGB_565); // 16 bit colors only!
bmARGB.recycle();

你可以试试i+4或者别的什么,而不是i++@Manmohan。我只绕过了一个单元格。System.arraycopy()然后将每4个元素设置为0,应该会得到相同的结果,但可能会更快?@neurite我终于想创建一个更小的数组-删除“a”通道。使用一个跳过alpha值的自定义值怎么样?出于好奇,我用C#运行您的代码,当然,我将
System.arraycopy
更改为
array.Copy
。然后该时间比原始时间长两倍(6091ms比3021ms)。也许C#中的
Array.Copy
的实现不同于Java中的
System.arraycopy
。我错了吗?坦率地说,C#与Java无关,所以我不清楚这与什么有什么关系。如上所述,是的,这是在JVM中的本机代码中实现的,并且比在Java上处理元素要快得多e-by-one.Yes!45ms对80msAFAIK,BitmapFactory没有RGB888 pix fmt。顺便说一句,我已经使用BitmapFactory创建了原始RGBA。
int div = 4;
int n = argbBytes.length - argbBytes.length%div;
int i=0;
int j=0;

for (; i<n; i+=div){
    // i = 0, 4, 8 ... then i, i+1,i+2 should pass (i%4<3)  
    thumbRGB888[j++] = argbBytes[i];
    thumbRGB888[j++] = argbBytes[i+1];
    thumbRGB888[j++] = argbBytes[i+2];
}

for(;i<argbBytes.length;i++){
    //i=n,n+1,n+2, since n%4==0 then (i%4<3) is passed
    thumbRGB888[j++] = argbBytes[i];
}
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inMutable = true; // Bitmap generated mutable.
opts.inPreferredConfig = Bitmap.Config.ARGB_8888; // I hope not BGRA.
Bitmap bmARGB = BitmapFactory.decodeByteArray(argbBytes, 0, argbBytes.length,
    opts);

bmARGB.setHasAlpha(false);

DisplayMetrics display = ...;
int[] colors = null; // Palette
Bitmap bmRGB = bmARBG.createBitmap(display, colors, width, height,
    Bitmap.Config.RGB_565); // 16 bit colors only!
bmARGB.recycle();