6

我想创建特定图像的位图图像,但我想抵制位图图像的宽度和高度。我正在使用以下代码......

image2  = BitmapFactory.decodeResource(getResources(), rid);
        Log.w("DEBUG","which is null:image i " + i.getWidth() + " OR " +i.getDrawable().getIntrinsicHeight () );
        Log.w("DEBUG","which is null:image h " + h.getWidth() + " OR " +h.getHeight() );
        Log.w("DEBUG","which is null:image2 " + image2.getWidth() + " OR " +image2.getHeight() );

     Bitmap image = Bitmap.createScaledBitmap(image2, i.getWidth(), i.getHeight(), false);
        Log.w("DEBUG","which is null:image " + image.getWidth() + " OR " +image.getHeight() );
        double bmWidth = image.getWidth();
          double bmHeight = image.getHeight(); 
          if ( x < 0 || y < 0 || x > getWidth() || y > getHeight()){
               return 0; //Invalid, return 0 
              }else{
               //Convert touched x, y on View to on Bitmap
               int xBm = (int)(x * (bmWidth / getWidth()));
               int yBm = (int)(y * (bmHeight / getHeight()));
               return image.getPixel(xBm, yBm); 

但它没有返回相同的输出........它显示了相同的宽度和高度,但我想要的输出没有出现。在我想要的输出高度变大......所以如何克服它。有人能推荐我吗

编辑:

this.setDrawingCacheEnabled(true);

        // this is the important code :)  
        // Without it the view will have a dimension of 0,0 and the bitmap will be null          
        this.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        this.layout(0, 0, this.getMeasuredWidth(), this.getMeasuredHeight()); 

        this.buildDrawingCache(true);
        Bitmap image = Bitmap.createBitmap(this.getDrawingCache());
        this.setDrawingCacheEnabled(false);
        //image2  = BitmapFactory.decodeResource(getResources(), rid);
        Log.w("DEBUG","which is null:image i " + i.getWidth() + " OR " +i.getDrawable().getIntrinsicHeight () );
        Log.w("DEBUG","which is null:image h " + h.getWidth() + " OR " +h.getHeight() );
        Log.w("DEBUG","which is null:image2 " + image2.getWidth() + " OR " +image2.getHeight() );


        Log.w("DEBUG","which is null:image " + image.getWidth() + " OR " +image.getHeight() );
        double bmWidth = image.getWidth();
          double bmHeight = image.getHeight(); 
          if ( x < 0 || y < 0 || x > getWidth() || y > getHeight()){
               return 0; //Invalid, return 0 
              }else{
               //Convert touched x, y on View to on Bitmap
               int xBm = (int)(x * (bmWidth / getWidth()));
               int yBm = (int)(y * (bmHeight / getHeight()));
               return image.getPixel(xBm, yBm); 
              }
}

现在它向我显示空指针异常... 堆栈跟踪

05-29 15:22:07.205: E/AndroidRuntime(889): FATAL EXCEPTION: main
05-29 15:22:07.205: E/AndroidRuntime(889): java.lang.NullPointerException
05-29 15:22:07.205: E/AndroidRuntime(889):  at android.graphics.Bitmap.createBitmap(Bitmap.java:358)
05-29 15:22:07.205: E/AndroidRuntime(889):  at com.example.nam.ImageIn.getmaskPixel(ImageIn.java:60)
05-29 15:22:07.205: E/AndroidRuntime(889):  at com.example.nam.AshActivity.getMaskColor(AshActivity.java:192)
05-29 15:22:07.205: E/AndroidRuntime(889):  at com.example.nam.FirstImage.pageinfo(FirstImage.java:102)
05-29 15:22:07.205: E/AndroidRuntime(889):  at com.example.nam.FirstImage.onTouch(FirstImage.java:65)
05-29 15:22:07.205: E/AndroidRuntime(889):  at android.view.View.dispatchTouchEvent(View.java:3762)
05-29 15:22:07.205: E/AndroidRuntime(889):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
05-29 15:22:07.205: E/AndroidRuntime(889):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
05-29 15:22:07.205: E/AndroidRuntime(889):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
05-29 15:22:07.205: E/AndroidRuntime(889):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
05-29 15:22:07.205: E/AndroidRuntime(889):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
05-29 15:22:07.205: E/AndroidRuntime(889):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
05-29 15:22:07.205: E/AndroidRuntime(889):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
05-29 15:22:07.205: E/AndroidRuntime(889):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
05-29 15:22:07.205: E/AndroidRuntime(889):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
05-29 15:22:07.205: E/AndroidRuntime(889):  at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
05-29 15:22:07.205: E/AndroidRuntime(889):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
05-29 15:22:07.205: E/AndroidRuntime(889):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
05-29 15:22:07.205: E/AndroidRuntime(889):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-29 15:22:07.205: E/AndroidRuntime(889):  at android.os.Looper.loop(Looper.java:123)
05-29 15:22:07.205: E/AndroidRuntime(889):  at android.app.ActivityThread.main(ActivityThread.java:4627)
05-29 15:22:07.205: E/AndroidRuntime(889):  at java.lang.reflect.Method.invokeNative(Native Method)
05-29 15:22:07.205: E/AndroidRuntime(889):  at java.lang.reflect.Method.invoke(Method.java:521)
05-29 15:22:07.205: E/AndroidRuntime(889):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-29 15:22:07.205: E/AndroidRuntime(889):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-29 15:22:07.205: E/AndroidRuntime(889):  at dalvik.system.NativeStart.main(Native Method)
4

3 回答 3

3

您可以只使用 imageView 的图像缓存。它将在将整个视图布局(缩放、与背景等)到新位图时渲染整个视图。

imageView.buildDrawingCache();
Bitmap bmap = imageView.getDrawingCache();

可能是这样的:

BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable();
Bitmap bitmap = drawable.getBitmap();

更多的

或将 sdcard 图像形成位图

FileInputStream in = new FileInputStream("/sdcard/test2.png");
BufferedInputStream buf = new BufferedInputStream(in);
byte[] bMapArray= new byte[buf.available()];
buf.read(bMapArray);
Bitmap bMap = BitmapFactory.decodeByteArray(bMapArray, 0, bMapArray.length
于 2012-05-29T09:49:16.497 回答
0

您是否尝试禁用自动缩放?

Matrix matrix = new Matrix();               
BitmapFactory.Options bfoOptions = new BitmapFactory.Options(); 
//Set to UnAutoScale
bfoOptions.inScaled = false;
//Fit to your size
matrix.setScale(widthRatio, heightRatio); 
Bitmap tempBitmap = BitmapFactory.decodeResource(res, resID, bfoOptions);
Bitmap outputbitmap = Bitmap.createBitmap(tempBitmap, 0, 0, tempBitmap.getWidth(), tempBitmap.getHeight(), matrix, true);
于 2012-05-29T13:54:11.220 回答
0

如果我了解您想要从另一个创建缩放位图。下面是一段代码,可让您调整位图的大小。

只需输入原始 Bitmap 对象和所需的 Bitmap 尺寸,此方法将返回给您新调整大小的 Bitmap!

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {

int width = bm.getWidth();

int height = bm.getHeight();

float scaleWidth = ((float) newWidth) / width;

float scaleHeight = ((float) newHeight) / height;

// create a matrix for the manipulation

Matrix matrix = new Matrix();

// resize the bit map

matrix.postScale(scaleWidth, scaleHeight);

// recreate the new Bitmap

Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);

return resizedBitmap;

}

获取触摸点的像素值

在您的位图对象上使用 Bitmap.getPixel(int x, int y)。它将返回 int 值,您需要通过向右移动位来取出单独的 a、r、g、b 值:

int pixelCol = bmp.getPixel(touchX,touchY);

          int a = (pixelCol >>> 24) & 0xff;
          int r = (pixelCol >>> 16) & 0xff;
          int g = (pixelCol >>> 8) & 0xff;
          int b = pixelCol & 0xff;
于 2012-05-29T09:53:43.313 回答