web-dev-qa-db-ja.com

ビットマップ画像を切り取る

どのようにビットマップ画像をトリミングできますか?これは、インテントを使用していくつかの概念を試しましたが、まだ失敗した私の質問です。

私は切り取りたいビットマップ画像を持っています!!

コードは次のとおりです。

 Intent intent = new Intent("com.Android.camera.action.CROP");  
                      intent.setClassName("com.Android.camera", "com.Android.camera.CropImage");  
                      File file = new File(filePath);  
                      Uri uri = Uri.fromFile(file);  
                      intent.setData(uri);  
                      intent.putExtra("crop", "true");  
                      intent.putExtra("aspectX", 1);  
                      intent.putExtra("aspectY", 1);  
                      intent.putExtra("outputX", 96);  
                      intent.putExtra("outputY", 96);  
                      intent.putExtra("noFaceDetection", true);  
                      intent.putExtra("return-data", true);                                  
                      startActivityForResult(intent, REQUEST_CROP_ICON);

この@Thanksについて誰でも私を助けることができます

49
user2134412

私はこの方法を使用して画像をトリミングしましたが、完璧に機能します:

Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.xyz);

resizedbitmap1=Bitmap.createBitmap(bmp, 0,0,yourwidth, yourheight);

createBitmap()は、ビットマップ、開始X、開始Y、幅および高さをパラメーターとして受け取ります

120
sankettt

上記の答えを使用して特定の範囲外の領域をスライス/クロップする場合は機能しません!このコードを使用すると、ソースが小さくても、常に希望のサイズを取得できます。

//  Here I want to slice a piece "out of bounds" starting at -50, -25
//  Given an endposition of 150, 75 you will get a result of 200x100px
Rect rect = new Rect(-50, -25, 150, 75);  
//  Be sure that there is at least 1px to slice.
assert(rect.left < rect.right && rect.top < rect.bottom);
//  Create our resulting image (150--50),(75--25) = 200x100px
Bitmap resultBmp = Bitmap.createBitmap(rect.right-rect.left, rect.bottom-rect.top, Bitmap.Config.ARGB_8888);
//  draw source bitmap into resulting image at given position:
new Canvas(resultBmp).drawBitmap(bmp, -rect.left, -rect.top, null);

...これで完了です!

13
coyer

私は切り取りで同様の問題を抱えており、多くのアプローチを試した後、私にとって意味のあるこのアプローチを見つけました。この方法は、画像を正方形に切り抜くだけで、まだ円形の形状に取り組んでいます(必要な形状を得るためにコードを自由に変更してください)。

したがって、最初に、切り取りたいビットマップがあります:

Bitmap image; //you need to initialize it in your code first of course

画像情報は、各ピクセルのカラー値を含む整数の配列にすぎないint []配列に格納されます。画像の左上隅からインデックス0で始まり、右下隅でインデックスNで終わります。 。この配列は、さまざまな引数を取るBitmap.getPixels()メソッドで取得できます。

正方形が必要なので、長い方の辺を短くする必要があります。また、画像を中央に保つには、画像の両側でトリミングを行う必要があります。画像が私の意味を理解する助けになることを願っています。 トリミングの視覚的表現 画像内の赤い点は、必要な初期および最終ピクセルを表し、ダッシュ付きの変数は、ダッシュなしの同じ変数と数値的に等しくなります。

最後に、コード:

int imageHeight = image.getHeight(); //get original image height
int imageWidth = image.getWidth();  //get original image width
int offset = 0;

int shorterSide = imageWidth < imageHeight ? imageWidth : imageHeight;
int longerSide = imageWidth < imageHeight ? imageHeight : imageWidth;
boolean portrait = imageWidth < imageHeight ? true : false;  //find out the image orientation
//number array positions to allocate for one row of the pixels (+ some blanks - explained in the Bitmap.getPixels() documentation)
int stride = shorterSide + 1; 
int lengthToCrop = (longerSide - shorterSide) / 2; //number of pixel to remove from each side 
//size of the array to hold the pixels (amount of pixels) + (amount of strides after every line)
int pixelArraySize = (shorterSide * shorterSide) + (shorterImageDimension * 1);
int pixels = new int[pixelArraySize];

//now fill the pixels with the selected range 
image.getPixels(pixels, 0, stride, portrait ? 0 : lengthToCrop, portrait ? lengthToCrop : 0, shorterSide, shorterSide);

//save memory
image.recycle();

//create new bitmap to contain the cropped pixels
Bitmap croppedBitmap = Bitmap.createBitmap(shorterSide, shorterSide, Bitmap.Config.ARGB_4444);
croppedBitmap.setPixels(pixels, offset, 0, 0, shorterSide, shorterSide);

//I'd recommend to perform these kind of operations on worker thread
listener.imageCropped(croppedBitmap);

//Or if you like to live dangerously
return croppedBitmap;
1
Peter Palka