【问题标题】:how to find pixel color in custom view?如何在自定义视图中查找像素颜色?
【发布时间】:2011-12-09 05:16:04
【问题描述】:

我已经使用 onDraw 方法准备了一个自定义视图,

我的视图类是,

public class MyAlphabetDraw extends View {

    Paint mPaint = new Paint();
    public static Bitmap myBitmap;

    public MyAlphabetDraw(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);

        mPaint.setDither(true);
        mPaint.setColor(0xFFFFFFFF);
        mPaint.setTextSize(50);

    }

    public void onDraw(Canvas canvas) {
        // canvas.drawColor(Color.BLUE);
        myBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(),
                Bitmap.Config.ARGB_8888);
                System.out.println("bitmaps ---"+myBitmap);
                canvas.drawText("Android", 50, 280,mAlphaInner);

        }

}

在这里,我将视图转换为位图,

myBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(),
                    Bitmap.Config.ARGB_8888);

在获得位图后,我使用转换为像素,

private int intArray[];

intArray = new int[myBitmap.getWidth() * myBitmap.getHeight()];

        // copy pixel data from the Bitmap into the 'intArray' array
        myBitmap.getPixels(intArray, 0, myBitmap.getWidth(), 0, 0, myBitmap.getWidth(),myBitmap.getHeight());

        // replace the red pixels with yellow ones
        for (int i = 0; i < intArray.length; i++) {
                    System.out.println("color is--"+i+" "+intArray[i]);
            if (intArray[i] == 0xFFFFFFFF) {

                intArray[i] = 0xFFFF0000;
            }
        }

如果 condition.sop 打印的颜色值始终为“0”,则此处控制不进入。有些地方我做错了......请告诉我

【问题讨论】:

  • 您将位图保存在myBitmap,但从bmp 获取像素。既然你已经发布了 sn-ps,我不能确定它是正确的。请检查它是否需要。
  • 感谢您的回复..我已经编辑了我的帖子...我将 bmp 更改为 myBitmap.现在也是同样的问题

标签: android colors bitmap pixel


【解决方案1】:

您的问题的答案是,您只会在代码中获得 0,因为您从未使用任何绘图更新您的位图。所有操作都与创建位图有关。

你必须调用像myBitmap.setPixel(0,0,color)这样的api。

现在,如果您想使用画布写入位图。你必须创建一个新的画布。这是 sudo 代码:

Canvas bmpCanvas = new Canvas(myBitmap);
bmpCanvas.drawText("Android", 50, 280,mAlphaInner);

// change pixel values in the bitmap like you are doing above 
// or you should use bmpCanvas to change the values
// and after that

canvas.drawBitmap(myBitmap, 0, 0, null);

这里有完整的实现,希望代码演练对你有所帮助:

package com.test;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class MyAlphabetDraw extends View {
    Paint mPaint = new Paint();
    Paint mAlphaInner = new Paint();
    public static Bitmap myBitmap;
    public static Canvas bmpCanvas;
    private int intArray[];

    public MyAlphabetDraw(Context context) {
        super(context);
        init();
    }

    public MyAlphabetDraw(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public MyAlphabetDraw(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    void init() {
        mPaint.setDither(true);
        mPaint.setColor(0xFFFFFFFF);
        mPaint.setTextSize(100);
        mPaint.setStrokeWidth(10);
        mAlphaInner.setDither(true);
        mAlphaInner.setColor(0xFF0000FF);
        mAlphaInner.setTextSize(98);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        if (myBitmap == null) {
            myBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(),
                    Bitmap.Config.ARGB_8888);
            bmpCanvas = new Canvas(myBitmap);
            intArray = new int[myBitmap.getWidth() * myBitmap.getHeight()];
        }

        if (bmpCanvas != null) {
            bmpCanvas.drawCircle(100, 100, 100, mPaint);
            bmpCanvas.drawCircle(100, 100, 90, mAlphaInner);

            // Code to get copy pixels into int array
            myBitmap.getPixels(intArray, 0, myBitmap.getWidth(), 0, 0, myBitmap.getWidth(),
                    myBitmap.getHeight());

            // Sample code if you put false the image will have white border
            // if true image will have red color for white pixels
            if (true) {
                for (int i = 0; i < intArray.length; i++) {
                    if (intArray[i] == 0xFFFFFFFF) {
                        intArray[i] = 0xFFFF0000;
                    }
                }
                myBitmap.setPixels(intArray, 0, myBitmap.getWidth(), 0, 0, myBitmap.getWidth(),
                        myBitmap.getHeight());
            }
        }

        if (myBitmap != null)
            canvas.drawBitmap(myBitmap, 0, 0, null);
    }
}

【讨论】:

  • 感谢重播,使用此代码后自定义视图未显示。父视图是emplay.....
  • 我想将我的自定义视图转换为像素,并找出哪个像素有颜色(白色)并替换为红色。
  • 添加后 canvas.drawBitmap(myBitmap, 0, 0, null) 视图被显示。但它只占用了一个像素(myBitmap.setPixel(10,10,Color.WHITE)) ...请帮帮我
  • 尝试在没有像素颜色替换代码的情况下运行您的代码,您能否放一些屏幕截图..?
  • 对不起,你不能这样做...但是你能用 pastebin 什么的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多