Android: java.lang.OutOfMemoryError: Không thể phân bổ phân bổ byte 23970828 với 2097152 byte miễn phí và 2MB cho đến OOM


355

Tôi muốn hiển thị hình ảnh Bitmap trong ImageView từ thẻ sd đã được lưu trữ. Sau khi chạy, ứng dụng của tôi bị sập và gặp lỗi OutOfMemoryError của:

(java.lang.OutOfMemoryError: Không thể phân bổ phân bổ byte 23970828 với 2097152 byte miễn phí và 2MB cho đến OOM)

Tôi không có ý tưởng hoặc tại sao nó ra khỏi bộ nhớ. Tôi nghĩ kích thước hình ảnh của tôi rất lớn nên tôi đã cố gắng thay đổi nó.

Iterator<String> it = imageArray.iterator();
while (it.hasNext()) {
  Object element = it.next();
  String objElement = element.toString();
  Log.e("objElement ", " = " + objElement);
  final ImageView imageView = new ImageView (getContext());
  final ProgressBar pBar = new ProgressBar(getContext(), null, 
                                           android.R.attr.progressBarStyleSmall);
  imageView.setTag(it);
  pBar.setTag(it);

  imageView.setImageResource(R.drawable.img_placeholder);
  pBar.setVisibility(View.VISIBLE);

  if (objElement.endsWith(mp3_Pattern)) {
     Log.e("Mp3 ", " ends with ");
     pBar.setVisibility(View.GONE);
     imageView.setImageResource(R.drawable.audio_control);
  }
  if (objElement.endsWith(png_Pattern)) {
     Bitmap bitmap = BitmapFactory.decodeFile(objElement);
     int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
     int x = (bitmap.getWidth() - size) / 2;
     int y = (bitmap.getHeight() - size) / 2;
     Bitmap bitmap_Resul = Bitmap.createBitmap(bitmap, x, y, size, size);
     Log.e("bitmap_Resul "," = "+ bitmap_Resul);

     if (bitmap_Resul != bitmap) {
        bitmap.recycle();
     }
     imageView.setImageBitmap(bitmap_Resul);
     Log.e("png_Pattern ", " ends with ");
     Log.e(" bitmap "," = " + bitmap);
  }

  holder.linearLayout.addView(imageView);
  holder.linearLayout.addView(pBar);

Thông tin nhật ký mèo:

08-27 14:11:15.307    1857-1857/? E/AndroidRuntime FATAL EXCEPTION: main
    Process: com.example.tazeen.classnkk, PID: 1857
    java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM
            at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
            at android.graphics.Bitmap.nativeCreate(Native Method)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:812)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:789)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:709)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:634)
            at com.example.tazeen.classnkk.AllPosts_Page$MyListAdapter.getView(AllPosts_Page.java:357)
            at android.widget.AbsListView.obtainView(AbsListView.java:2347)
            at android.widget.ListView.makeAndAddView(ListView.java:1864)
            at android.widget.ListView.fillDown(ListView.java:698)
            at android.widget.ListView.fillFromTop(ListView.java:759)
            at android.widget.ListView.layoutChildren(ListView.java:1659)
            at android.widget.AbsListView.onLayout(AbsListView.java:2151)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
            at android.view.Choreographer.doCallbacks(Choreographer.java:580)
            at android.view.Choreographer.doFrame(Choreographer.java:550)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

4
kiểm tra các pixel của hình ảnh, chiều rộng không được vượt quá 1440 và chiều cao 2560, bằng cách này, nó sẽ không hiển thị OutOfMemoryError
Pankaj Lilan

1
@PankajLilan Bạn đã tìm thấy những giá trị này ở đâu (1440 X 2560)? Bất kỳ tài liệu tham khảo từ tài liệu Android?
LCJ

Câu trả lời:


525

OutOfMemoryError là vấn đề phổ biến nhất xảy ra trong Android trong khi đặc biệt là xử lý bitmap. Lỗi này được Máy ảo Java (JVM) ném ra khi một đối tượng không thể được phân bổ do thiếu không gian bộ nhớ và đồng thời, trình thu gom rác không thể giải phóng một số không gian.

Như được đề cập bởi Aleksey, bạn có thể thêm các thực thể bên dưới vào tệp kê khai của mình android:hardwareAccelerated="false", android:largeHeap="true"nó sẽ hoạt động cho một số môi trường.

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

bạn chắc chắn nên đọc một số khái niệm Nhà phát triển Android, đặc biệt tại đây: Hiển thị Bitmap hiệu quả

Đọc tất cả 5 chủ đề và viết lại mã của bạn một lần nữa. Nếu nó vẫn không hoạt động, chúng tôi sẽ rất vui khi thấy những gì bạn đã làm sai với tài liệu hướng dẫn.

Dưới đây là một số câu trả lời có thể có cho các loại lỗi này trong SOF

Android: BitmapFactory.decodeStream () hết bộ nhớ với tệp 400KB với heap miễn phí 2MB

Cách giải quyết sự cố java.lang.OutOfMemoryError trong Android

Android: java.lang.OutOfMemoryError

java.lang.OutOfMemoryError

Giải pháp cho OutOfMemoryError: kích thước bitmap vượt quá ngân sách VM

Chỉnh sửa: Từ các bình luận của @cjnash

Đối với bất kỳ ai vẫn gặp sự cố sau khi họ thêm dòng này, hãy thử dán hình ảnh của bạn vào thư mục res / drawable-xhdpi / thay vì res / drawable / và nó có thể giải quyết vấn đề của bạn.


1
Bạn có thể xin vui lòng gửi làm thế nào cuối cùng bạn đã giải quyết vấn đề? Bởi vì tôi có cùng một vấn đề ... Thật ra bạn có thể thêm vào tệp kê khai của mình dòng này android: phần cứngAccelerated = "false", android: LargeHeap = "true" nó đang hoạt động trong một số trường hợp, nhưng hãy lưu ý rằng một phần khác của mã có thể tranh cãi với điều này ...
Aleksey Timoshchenko

6
điều hướng ứng dụng đang trở nên rất chậm sau khi thêm điều này.
Uma Achanta

10
android: phần
cứngAccelerated

1
Đối với bất kỳ ai vẫn gặp sự cố sau khi họ thêm dòng này, hãy thử dán hình ảnh của bạn vào thư mục res / drawable-xhdpi / thay vì res / drawable / và nó có thể giải quyết vấn đề của bạn.
cjnash

6
tại sao bạn lại đề xuất android: phần
cứngAccelerated

86

Bạn đã thử thêm nó vào bảng kê khai của bạn trong các ứng dụng chưa? android:largeHeap="true"?

như thế này

  <application
      android:name=".ParaseApplication"
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme"
      android:largeHeap="true" >

17
Tôi đã thử với android này: LargeHeap = "true" nhưng gặp lỗi tương tự
androidTag

1
hãy thử nén hình ảnh của bạn trước khi bạn có thể sử dụng liên kết này để làm như vậy tinyjpg.com
TSG

1
bạn cũng có thể nén png với trang web này
TSG

27

Đối với tôi, vấn đề là tệp .png của tôi đã được giải nén thành một bitmap thực sự lớn trong bộ nhớ, vì hình ảnh có kích thước rất lớn (mặc dù kích thước tệp rất nhỏ).

Vì vậy, cách khắc phục chỉ đơn giản là thay đổi kích thước hình ảnh :)


3
Đây là giải pháp chính xác, vì trước tiên tôi đã thử các giải pháp trên, nhưng sau khi áp dụng android:hardwareAccelerated="false", một số hình ảnh động như bóng bố cục không hoạt động. Nhưng sau khi thay đổi kích thước tất cả các vấn đề đã được giải quyết cảm ơn bạn! +1 cho gợi ý này!
Kaushal28

1
Điều này đã khắc phục vấn đề của tôi. Cảm ơn bạn @petrus
Hùng Nguyễn

27

Trên thực tế bạn có thể thêm vào bảng kê khai của mình những dòng này android:hardwareAccelerated="false", android:largeHeap="true"nó đang hoạt động trong một số tình huống, nhưng lưu ý rằng phần khác của mã có thể tranh luận với điều này.

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

2
không hoạt động, nó đã bị lỗi với cùng một lỗi, khi được sử dụng Bitmap.createBitmap
Narendra Singh

@ Xin lỗi (tôi cũng đã dành một chút thời gian để giải quyết vấn đề này và đó là công việc đối với tôi. Nhưng đó chỉ là một trong những cách ... Có rất nhiều cách tiếp cận khác nhau
Aleksey Timoshchenko

2
Mục đích của android: phần cứngAccelerated = "false" là gì?
IgorGanapolsky

@IgorGanapolsky Từ tài liệu chính thức nói .. xem liên kết này
Shylendra Madda

27

Điều này sẽ làm việc

 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inSampleSize = 8;

 mBitmapSampled = BitmapFactory.decodeFile(mCurrentPhotoPath,options);

11

Thay đổi kích thước hình ảnh của bạn trước khi thiết lập thành ImageView như thế này:

Bitmap.createScaledBitmap(_yourImageBitmap, _size, _size, false);

trong đó kích thước là kích thước thực của ImageView. Bạn có thể đạt kích thước bằng cách đo:

imageView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

và sử dụng kích thước tiếp theo imageView.getMeasuredWidth()imageView.getMeasuredHeight()cho scaling.


Tôi đã thử với android này: LargeHeap = "true" nhưng gặp lỗi tương tự
androidTag

Một ví dụ nữa về lý do tại sao điều này sẽ không nhất thiết phải hoạt động (sử dụng bộ nhớ ứng dụng riêng): Đặt một bitmap trong res / drawable / có thể gây ra lỗi tương tự nhưng nó sẽ không xảy ra mỗi lần. Đặt cùng một bitmap vào res / drawable-xhdpi / sẽ không còn lỗi. Vì vậy, như là một câu trả lời, nó không chính xác.
CmosBattery

8

Sử dụng Thư viện Glide và ghi đè kích thước để kích thước nhỏ hơn;

Glide.with(mContext).load(imgID).asBitmap().override(1080, 600).into(mImageView);

6

Tôi gặp lỗi dưới đây

"E / art: Ném raOfMemoryError" Không thể phân bổ phân bổ byte 47251468 với 16777120 byte miễn phí và 23MB cho đến OOM "

Sau khi thêm android:largeHeap="true"vào AndroidManifest.xml, tôi sẽ loại bỏ tất cả các lỗi

<application
    android:allowBackup="true"
    android:icon="@mipmap/guruji"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:largeHeap="true"
    android:theme="@style/AppTheme">

4

Tôi đã giải quyết vấn đề này bằng cách thay đổi kích thước hình ảnh thành kích thước thấp hơn. Tôi đang sử dụng mẫu xamarin. giảm kích thước của hình ảnh PNG đã giải quyết vấn đề.


4

Vấn đề: Không thể phân bổ phân bổ byte 37748748 với 16777120 byte miễn phí và 17MB cho đến khi OOM

Giải pháp: 1. mở tệp kê khai của bạn 2. bên trong thẻ ứng dụng chỉ cần thêm bên dưới hai dòng

 android:hardwareAccelerated="false"
 android:largeHeap="true"

Thí dụ :

 <application
        android:allowBackup="true"
        android:hardwareAccelerated="false"
        android:largeHeap="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

4

Tôi đã thấy rằng hình ảnh trong thư mục 'drawable' sẽ được chuyển đổi thành hình ảnh lớn hơn nhiều trên điện thoại độ phân giải cao. Ví dụ: hình ảnh 200k sẽ được ghép lại thành độ phân giải cao hơn, như 800k hoặc 32000k. Tôi đã phải tự mình khám phá điều này và đến nay vẫn chưa thấy tài liệu nào cho cái bẫy bộ nhớ heap này. Để ngăn chặn điều này, tôi đặt mọi thứ vào một thư mục có thể rút ra được (ngoài việc sử dụng 'tùy chọn' trong BitmapFactory dựa trên đống thiết bị cụ thể). Tôi không đủ khả năng để kích thước ứng dụng của mình tăng lên với nhiều thư mục có thể vẽ được, đặc biệt là vì phạm vi của màn hình quá lớn hiện nay. Điều khó khăn là studio bây giờ không chỉ ra cụ thể thư mục 'drawable-gậtpi' như trong chế độ xem dự án, nó chỉ hiển thị thư mục 'drawable'. Nếu bạn không cẩn thận, khi bạn thả hình ảnh vào thư mục này trong studio, nó sẽ thắng '

Careful here 'backgroundtest' did not actually go to drawable-nodpi and will 
be resampled higher, such as 4x or 16x of the original dimensions for high def screens.

nhập mô tả hình ảnh ở đây

Hãy chắc chắn nhấp xuống thư mục gật đầu trong đoạn hội thoại, vì chế độ xem dự án sẽ không hiển thị cho bạn tất cả các thư mục có thể vẽ riêng biệt như trước đây, vì vậy sẽ không rõ ràng rằng nó đã bị sai. Studio đã tạo lại vanilla 'drawable' tại một số điểm cho tôi sau khi tôi đã xóa nó từ lâu:

nhập mô tả hình ảnh ở đây


3

Điều này làm việc cho tôi: chỉ cần di chuyển hình ảnh từ thư mục drawable sang drawable-hdpi.


những gì giải thích về điều này? Tại sao di chuyển này hoạt động?
Harun

vui lòng giải thích tại sao điều này hoạt động ...?
X-Black ...

3

Soluton thử điều này trong Tệp kê khai của bạn và sử dụng Thư viện Glide

biên dịch 'com.github.bumptech.glide: glide: 3.7.0'

    **Use Glide Library and Override size to less size;**

 if (!TextUtils.isEmpty(message.getPicture())) {
            Glide.with(mContext).load(message.getPicture())
                    .thumbnail(0.5f)
                    .crossFade()
                    .transform(new CircleTransform(mContext))
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(holder.imgProfile);
        } 

android: phần cứngAccelerated = "sai"

android: LargeHeap = "đúng"

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

Sử dụng thư viện này

  compile 'com.github.bumptech.glide:glide:3.7.0'   

Mã hóa hạnh phúc làm việc của nó

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;

import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;


public class CircleTransform extends BitmapTransformation {
    public CircleTransform(Context context) {
        super(context);
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return circleCrop(pool, toTransform);
    }

    private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;

        int size = Math.min(source.getWidth(), source.getHeight());
        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;

        // TODO this could be acquired from the pool too
        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);

        Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);
        return result;
    }

    @Override
    public String getId() {
        return getClass().getName();
    }
}

3

thêm điều này vào bảng kê khai của bạn dưới các ứng dụng? android: LargeHeap = "đúng"


cũng có thêm một giải pháp: thay đổi chiều cao = chiều cao * .75 và chiều rộng = chiều rộng * .75.
SAURABH OMER

2

Tôi đã có vấn đề quá.

Tương tự với hầu hết những người khác ở trên. Vấn đề được gây ra bởi hình ảnh lớn.

Chỉ cần thay đổi kích thước một số hình ảnh, và không cần thay đổi bất kỳ mã nào.



1

Tôi là một người mới trong việc phát triển Android nhưng tôi hy vọng giải pháp của mình có ích, nó hoạt động hoàn hảo với điều kiện của tôi. Tôi đang sử dụng Imageview và đặt nền của nó thành "src" vì tôi đang cố gắng tạo hoạt hình khung. Tôi đã gặp lỗi tương tự nhưng khi tôi cố mã hóa nó, nó đã hoạt động

int ImageID = this.Resources.GetIdentifier(questionPlay[index].Image.ToLower(), "anim", PackageName);
            imgView.SetImageResource(ImageID);
            AnimationDrawable animation = (AnimationDrawable)imgView.Drawable;
            animation.Start();
            animation.Dispose();

1

Tôi gặp phải vấn đề này khi tôi không giết chết hoạt động cũ của mình khi chuyển sang một hoạt động mới. Tôi đã sửa nó bằngfinish();

    Intent goToMain = new Intent(this,MainActivity.class);
    startActivity(goToMain);
    finish();

1
Bitmap image =((BitmapDrawable)imageView1.getDrawable()).getBitmap();

ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();

image.compress(Bitmap.CompressFormat.JPEG,50/100,byteArrayOutputStream);

50/100 nếu một người sử dụng 100 thì độ phân giải gốc có thể khiến Ứng dụng hết bộ nhớ.

nếu 50 hoặc ít hơn 100 thì độ phân giải này sẽ là 50% hoặc dưới 100, vì vậy điều này sẽ tránh được vấn đề bộ nhớ


1

Bạn phải thay đổi kích thước của đối tượng trong drawable. Nó quá lớn để Android hiển thị. ví dụ: Nếu bạn đang thiết lập hình ảnh hãy thử hình ảnh với ít pixel hơn. Nó làm việc cho tôi. Cảm ơn. :)


1

Ứng dụng của bạn bị sập vì kích thước hình ảnh của bạn (tính bằng MB hoặc KB) quá lớn nên không phân bổ không gian cho điều đó. Vì vậy, trước khi dán hình ảnh của bạn trong drawable chỉ cần giảm kích thước.

HOẶC LÀ

Bạn có thể thêm Theo dõi trong thẻ ứng dụng tại Manifest.xml

 android:hardwareAccelerated="false"
    android:largeHeap="true"
    android:allowBackup="true"

Sau khi thêm ứng dụng này sẽ không sụp đổ.

  • luôn sử dụng hình ảnh kích thước ít hơn trong ứng dụng.
  • Nếu bạn thêm kích thước hình ảnh lớn trong ứng dụng, bạn nên thêm cú pháp ở trên, nhưng kích thước ứng dụng sẽ tăng lên.

1

Vấn đề của tôi đã được giải quyết sau khi thêm

 dexOptions {
        incremental true
        javaMaxHeapSize "4g"
        preDexLibraries true
        dexInProcess = true
    }

trong tập tin Build.Gradle


Điều này chỉ làm cho ứng dụng của bạn thực sự cồng kềnh trong việc sử dụng bộ nhớ
OneCricketeer

@ cricket_007 Hậu quả của việc đó là gì?
Saletanth Karumanaghat

1
Last but not the least....

Try Method One:

Simple Add these lines of code in the gradle file

dexOptions {
        incremental true
        javaMaxHeapSize "4g"
     }

Example:

android {
    compileSdkVersion XX
    buildToolsVersion "28.X.X"

    defaultConfig {
        applicationId "com.example.xxxxx"
        minSdkVersion 14
        targetSdkVersion 19
    }

dexOptions {
        incremental true
        javaMaxHeapSize "4g"
     }
}

*******************************************************************

Method Two:

Add these two lines of code in manifest file...

android:hardwareAccelerated="false" 
android:largeHeap="true"

Example:

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:hardwareAccelerated="false"
        android:largeHeap="true"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

It will Work for sure any of these cases.....

0

Nếu tải lên một hình ảnh, hãy thử giảm chất lượng hình ảnh, đó là tham số thứ hai của Bitmap. Đây là giải pháp trong trường hợp của tôi. Trước đây là 90, sau đó tôi đã thử với 60 (vì nó nằm trong mã bên dưới bây giờ).

Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
finalBitmap.compress(Bitmap.CompressFormat.JPEG,60,baos);
byte[] b = baos.toByteArray();

0

Hãy thử một cách đơn giản nhất. Có thể ứng dụng của bạn bị sập vì kích thước hình ảnh của bạn (tính bằng MB) quá lớn nên không phân bổ không gian cho điều đó. Vì vậy, trước khi dán hình ảnh của bạn trong drawable, chỉ cần giảm kích thước bởi bất kỳ phần mềm trình xem nào hoặc nếu bạn đang chụp ảnh từ thư viện trong thời gian chạy hơn trước khi lưu nó nén bitmap của bạn. Nó làm việc cho tôi. chắc chắn cho bạn sẽ được.


0
stream = activity.getContentResolver().openInputStream(uri);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;

bitmap = BitmapFactory.decodeStream(stream, null, options);
int Height = bitmap.getHeight();
int Width = bitmap.getWidth();
enter code here
int newHeight = 1000;
float scaleFactor = ((float) newHeight) / Height;
float newWidth = Width * scaleFactor;

float scaleWidth = scaleFactor;
float scaleHeight = scaleFactor;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
resizedBitmap= Bitmap.createBitmap(bitmap, 0, 0,Width, Height, matrix, true);
bitmap.recycle();

Sau đó, trong thẻ Appliaction, thêm Largeheapsize = "true


0

Tôi cho rằng bạn muốn sử dụng hình ảnh này như một biểu tượng. Như Android đang nói với bạn, hình ảnh của bạn quá lớn. Những gì bạn chỉ cần làm là chia tỷ lệ hình ảnh của bạn để Android biết kích thước của hình ảnh sẽ sử dụng và khi nào theo độ phân giải màn hình. Để thực hiện việc này, trong Android Studio: 1. nhấp chuột phải vào thư mục res, 2. chọn Tài sản hình ảnh 3. Chọn biểu tượng Loại 4. Đặt tên cho biểu tượng 5. Chọn Hình ảnh trên Loại tài sản 6. Cắt hình ảnh của bạn Nhấp vào tiếp theo và kết thúc . Trong xml hoặc mã nguồn của bạn, chỉ cần tham khảo hình ảnh sẽ được đặt trong thư mục bố cục hoặc mipmap theo loại nội dung được chọn. Lỗi sẽ biến mất.


0

Tôi thực sự không khuyên bạn nên chỉnh sửa bảng kê khai như thế này

android: phần cứngAccelerated = "false", android: LargeHeap = "true"

Các tùy chọn này gây ra hiệu ứng hoạt hình không mượt mà trên ứng dụng của bạn. Ngoài ra, 'liveData' hoặc thay đổi DB cục bộ (Sqlite, Room) của bạn kích hoạt chậm. Nó là xấu cho trải nghiệm người dùng.

Vì vậy, tôi khuyên bạn nên GIẢI QUYẾT bitmap

Dưới đây là mã mẫu

fun resizeBitmap(source: Bitmap): Bitmap {
      val maxResolution = 1000    //edit 'maxResolution' to fit your need
      val width = source.width
      val height = source.height
      var newWidth = width
      var newHeight = height
      val rate: Float

            if (width > height) {
                if (maxResolution < width) {
                    rate = maxResolution / width.toFloat()
                    newHeight = (height * rate).toInt()
                    newWidth = maxResolution
                }
            } else {
                if (maxResolution < height) {
                    rate = maxResolution / height.toFloat()
                    newWidth = (width * rate).toInt()
                    newHeight = maxResolution
                }
            }
            return Bitmap.createScaledBitmap(source, newWidth, newHeight, true)
 }

0

Nếu android: LargeHeap = "true" không hoạt động với bạn thì

1:

Nén hình ảnh. Tôi đang sử dụng trang web này

2:

Chuyển đổi hình ảnh sang mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. Tôi đang sử dụng webiste này

Đừng xóa android: LargeHeap = "true"!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.