Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更快地设置(PNG)位图颜色,而不是逐像素设置_Java_Android_Colors - Fatal编程技术网

Java 更快地设置(PNG)位图颜色,而不是逐像素设置

Java 更快地设置(PNG)位图颜色,而不是逐像素设置,java,android,colors,Java,Android,Colors,我有一些我正在应用颜色的png文件。颜色根据用户的选择而变化。我通过另一种方法设置的3个RGB值更改颜色。png文件是一个随机形状,形状外部完全透明。我不想修改透明度,只想修改RGB值。目前,我正在逐像素设置RGB值(请参见下面的代码) 我逐渐意识到这是难以置信的缓慢,可能只是在应用程序中效率不够。有没有更好的办法 以下是我目前正在做的事情。您可以看到,对于占据屏幕适当部分的图像而言,像素阵列是巨大的: public void foo(Component component, Component

我有一些我正在应用颜色的png文件。颜色根据用户的选择而变化。我通过另一种方法设置的3个RGB值更改颜色。png文件是一个随机形状,形状外部完全透明。我不想修改透明度,只想修改RGB值。目前,我正在逐像素设置RGB值(请参见下面的代码)

我逐渐意识到这是难以置信的缓慢,可能只是在应用程序中效率不够。有没有更好的办法

以下是我目前正在做的事情。您可以看到,对于占据屏幕适当部分的图像而言,像素阵列是巨大的:

public void foo(Component component, ComponentColor compColor, int userColor) {
    int h = component.getImages().getHeight();
    int w = component.getImages().getWidth();
    mBitmap = component.getImages().createScaledBitmap(component.getImages(), w, h, true);

    int[] pixels = new int[h * w];

    //Get all the pixels from the image
    mBitmap[index].getPixels(pixels, 0, w, 0, 0, w, h);

    //Modify the pixel array to the color the user selected
    pixels = changeColor(compColor, pixels);

    //Set the image to use the new pixel array
    mBitmap[index].setPixels(pixels, 0, w, 0, 0, w, h);
}

public int[] changeColor(ComponentColor compColor, int[] pixels) {
    int red = compColor.getRed();
    int green = compColor.getGreen();
    int blue = compColor.getBlue();
    int alpha;

    for (int i=0; i < pixels.length; i++) {
        alpha = Color.alpha(pixels[i]);
        if (alpha != 0) {
            pixels[i] = Color.argb(alpha, red, green, blue);
        }
    }
    return pixels;
}
public void foo(组件组件、组件颜色、int-userColor){
int h=component.getImages().getHeight();
int w=component.getImages().getWidth();
mBitmap=component.getImages().createScaledBitmap(component.getImages(),w,h,true);
int[]像素=新的int[h*w];
//从图像中获取所有像素
mBitmap[index].getPixels(像素,0,w,0,0,w,h);
//将像素阵列修改为用户选择的颜色
像素=更改颜色(compColor,像素);
//将图像设置为使用新像素阵列
mBitmap[index].setPixels(像素,0,w,0,0,w,h);
}
公共int[]changeColor(ComponentColor,int[]像素){
int red=compColor.getRed();
int green=compColor.getGreen();
int blue=compColor.getBlue();
int-alpha;
对于(int i=0;i
您看过中提供的功能了吗?听起来可能有用。您还可以看看Android中实现类似功能的方式,看看如果它不能完全满足您的需求,您如何使其适应您的特定情况。

对我有效的答案是这里的一个总结

它们提供了一个更快的代码片段来完成这项工作。我尝试了提取Alpha,但没有成功,但Square的解决方案成功了。只需修改他们的解决方案,改为修改颜色位,而不是alpha位

i、 e


也许你可以使用一个带有调色板的图像?由于您对所有内容都使用一种颜色,这意味着您无论如何只能从一个输入中获得256种可能的像素颜色(因为RGB部分相同,而只有A部分不同)。如果您的图像具有256种不同颜色的调色板,而这些颜色仅在alpha通道的值上有所不同,则您只需要修改调色板,而不需要修改图像数据本身。我可能不理解您的意思,也可能您真的不理解我的问题。我要修改的每个图像都有2个alpha值,完全透明和半透明/不透明。我想修改RGB值并保持alpha值不变。也就是说,虽然我得到了调色板的概念,但android中没有调色板类。你建议我读什么?@user:是的,如果你的PNG文件使用调色板,你不需要修改像素,只需要修改调色板。即使没有SDK支持,您也可以将PNG文件本身作为原始数据读取,并在通过内存流加载之前在内存中修改调色板。这不是一个很好的解决方案,但如果您需要它,并且没有人有更好的想法,它仍然可能带来性能改进。不过,这应该相对简单,因为您不必处理压缩数据;有关详细信息,请参阅。位图中可能有一些内容可用,但从它的声音来看,extractAlpha不会这样做,因为它没有考虑通过该方法的绘制的RGB值(除非它只是未记录)。也许值得一试。我来试试。我不是说它能解决你的整个问题,只是说它会有用。如果你阅读了文档,它谈到了如何将它与drawCanvas相结合来填充颜色信息。哇,它成功了!!!不幸的是,只有2.2版,而不是1.6版。在1.6上有奇怪的问题,但我想这是另一个问题。
pixels[x] = (pixels[x] & 0xFF000000) | (color & 0x00FFFFFF);