7

I want to create a bitmap image of particular image but i want to resist the width and height of the bitmapimage. i am using the following code ......

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); 

but it is not returning me the same output ........it is showing me the same width and height but my desired output is not coming. in my desired output height is get large ......so how to overcome that. can nay one suggest me

edited :

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); 
              }
}

now it is showing me null pointer exception... stacktrace

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)
bobygerm
  • 483
  • 10
  • 21
Ashishsingh
  • 742
  • 2
  • 12
  • 31

3 Answers3

4

You could just use the imageView's image cache. It will render the entire view as it is layed out (scaled,bordered with a background etc) to a new bitmap.

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

and may be this:

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

More

or form sdcard image to bitmap

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
Community
  • 1
  • 1
  • can you explain me about the sdcardimage to bitmap .....that can be help more to understand this because i am beginner – Ashishsingh May 29 '12 at 09:57
0

If i have understand you you want to create a scaled bitmap from another.Below is a snippet of code that will allow you to resize a Bitmap.

Simply input the original Bitmap object and the desired dimensions of the Bitmap, and this method will return to you the newly resized 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;

}

To get the pixel values of touched point

Use Bitmap.getPixel(int x, int y) on your bitmap object. It will return you the int value from where you need to take out separate a,r,g,b values by shifting bits to the right:

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;
K_Anas
  • 31,226
  • 9
  • 68
  • 81
  • you want to resize a bitmap is that what you want?* – K_Anas May 29 '12 at 10:14
  • basically in this function i want that whnen user touch on that pixel then it should return the color of the pixel....but when i convert into bitmap then it 's height is get large but width is normal . – Ashishsingh May 29 '12 at 10:19
  • i know that but the bitmap image is converted it is not giving me correct value and bitmap image is properly converted ....... – Ashishsingh May 29 '12 at 11:08
0

Do you try to disable the auto-scale?

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);
John
  • 323
  • 2
  • 4
  • 13