Android : java.lang.OutOfMemoryError : 2097152 여유 바이트와 OOM까지 2MB로 23970828 바이트 할당을 할당하지 못했습니다.


355

이미 저장된 SD 카드의 ImageView에 비트 맵 이미지 를 표시하고 싶습니다 . 실행 후 내 응용 프로그램이 중단되고 다음의 OutOfMemoryError 오류가 발생합니다.

(java.lang.OutOfMemoryError : 사용 가능한 바이트가 2097152이고 OOM까지 2MB 인 23970828 바이트 할당에 실패했습니다)

나는 왜 메모리가 부족한지 전혀 모른다. 이미지 크기가 매우 커서 이미지를 변경하려고했습니다.

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

로그 고양이 정보 :

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
이미지의 픽셀을 확인 폭과 높이 1,440 2,560을 초과하지 않아야, 이렇게함으로써 그것이 표시되지 OutOfMemoryError가
카지 Lilan

1
@PankajLilan이 값을 어디에서 찾았습니까 (1440 X 2560)? 안드로이드 문서에서 참조가 있습니까?
LCJ

답변:


525

OutOfMemoryError 는 특히 비트 맵을 처리하는 동안 안드로이드에서 발생하는 가장 일반적인 문제입니다. 이 오류는 메모리 공간 부족으로 인해 오브젝트를 할당 할 수없고 가비지 콜렉터가 일부 공간을 확보 할 수없는 경우 JVM (Java Virtual Machine)에서 발생합니다.

알렉세이에서 언급 한 바와 같이, 당신은 당신의 매니페스트 파일에서 개체 아래에 추가 할 수 있습니다 android:hardwareAccelerated="false", android:largeHeap="true"그것은 어떤 환경에서의 작동합니다.

<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">

비트 맵을 효율적으로 표시 하려면 여기에서 Android 개발자 개념 중 일부를 명확하게 읽어야합니다.

5 가지 주제를 모두 읽고 코드를 다시 작성하십시오. 그래도 문제가 해결되지 않으면 튜토리얼 자료에서 잘못된 점을 확인하게되어 기쁩니다.

SOF에서 이러한 유형의 오류에 대한 가능한 답변은 다음과 같습니다.

Android : 사용 가능한 힙이 2MB 인 400KB 파일의 메모리 부족 BitmapFactory.decodeStream ()

안드로이드에서 java.lang.OutOfMemoryError 문제를 해결하는 방법

안드로이드 : java.lang.OutOfMemoryError

java.lang.OutOfMemoryError

OutOfMemoryError에 대한 솔루션 : 비트 맵 크기가 VM 예산을 초과합니다

편집 : @cjnash의 의견에서

이 줄을 추가 한 후에도 여전히 충돌이 발생한 사람은 이미지를 res / drawable / 대신 res / drawable-xhdpi / 폴더에 붙여 넣으면 문제가 해결 될 수 있습니다.


1
결국 어떻게 문제를 해결했는지 게시 해 주시겠습니까? 같은 문제가 있기 때문에 ... 실제로 매니페스트에 android : hardwareAccelerated = "false", android : largeHeap = "true"행을 추가 할 수 있습니다. 일부 상황에서는 작동하지만 코드의 다른 부분은 이와 함께 ... 주장 할 수
알렉세이 Timoshchenko

6
이것을 추가 한 후 앱 탐색이 매우 느려집니다.
Uma Achanta

10
android : hardwareAccelerated = "false"앱 정지
Rahim Rahimov

1
이 줄을 추가 한 후에도 여전히 충돌이 발생한 사람은 이미지를 res / drawable / 대신 res / drawable-xhdpi / 폴더에 붙여 넣으면 문제가 해결 될 수 있습니다.
cjnash

6
왜 android : hardwareAccelerated = "false를 제안 하시겠습니까? 그것의 장점은 무엇입니까?
batmaci

86

응용 프로그램에서 매니페스트에 이것을 추가하려고 했습니까? android:largeHeap="true"?

이처럼

  <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
나는이 android : largeHeap = "true"시도했지만 같은 오류가 발생합니다
androidTag

1
이 링크를 사용하여 이미지를 압축하기 전에 이미지를 압축하십시오. tinyjpg.com
TSG

1
이 사이트에서 png를 압축 할 수도 있습니다
TSG

27

나에게 문제는 이미지의 크기가 매우 크기 때문에 (파일 크기는 작지만) 내 .png 파일이 메모리에서 매우 큰 비트 맵으로 압축 해제되었다는 것입니다.

그래서 수정은 단순히 이미지 크기를 조정하는 것이 었습니다. :)


3
위의 솔루션을 먼저 시도했지만 적용 한 후에 android:hardwareAccelerated="false"레이아웃 그림자와 같은 일부 애니메이션이 작동하지 않았기 때문에 이것이 올바른 솔루션 입니다. 그러나 모든 문제의 크기를 조정 한 후 감사합니다! 이 힌트 +1!
Kaushal28

1
이것은 내 문제를 해결했다. 감사합니다 @petrus
Hùng Nguyễn

27

사실 당신은 당신의 매니페스트이 라인에 추가 할 수 있습니다 android:hardwareAccelerated="false", android:largeHeap="true"그것은 어떤 상황에서 근무하지만, 코드의 다른 부분이 함께 주장 할 수 있음을 유의하십시오.

<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
작동하지 않았다, 그것은 Bitmap.createBitmap 사용 된 것과 동일한 오류로 추락
나렌드라 싱

다른 접근 방법이 많이 있습니다 ... 죄송합니다 @King (나는 또한이 문제를 해결하기 위해 약간의 시간을 보냈다, 그리고 그것은 나를위한 작품이다 그러나 그것은 다만 방법 중 하나입니다.
알렉세이 Timoshchenko

2
android : hardwareAccelerated = "false" 의 목적은 무엇입니까 ?
IgorGanapolsky

공식 문서에서 @IgorGanapolsky 말한다 .. 이 링크를 참조
Shylendra Madda

27

이 작동합니다

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

 mBitmapSampled = BitmapFactory.decodeFile(mCurrentPhotoPath,options);

11

다음과 같이 ImageView로 설정하기 전에 이미지 크기를 조정 하십시오.

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

여기서 size는 ImageView의 실제 크기입니다. 다음을 측정하여 크기에 도달 할 수 있습니다.

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

다음 크기 imageView.getMeasuredWidth()imageView.getMeasuredHeight()를 사용하십시오 scaling.


나는이 android : largeHeap = "true"시도했지만 같은 오류가 발생합니다
androidTag

이것이 개인용 앱 스토리지를 사용하여 작동하지 않는 이유의 추가 예 : res / drawable /에 비트 맵을 배치하면 동일한 오류가 발생할 수 있지만 매번 발생하지는 않습니다. 동일한 비트 맵을 res / drawable-xhdpi /에 배치하면 더 이상 오류가 발생하지 않습니다. 답으로, 그 자체로는 정확하지 않습니다.
CmosBattery

8

글라이드 라이브러리 및 크기 무시를 사용 하여 크기를 줄입니다.

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

6

오류가 발생했습니다

"E / art : ThrowOfOutMemoryError"16777120 여유 바이트 및 OOM까지 23MB의 47251468 바이트 할당을 할당하지 못했습니다. "

추가 한 후 android:largeHeap="true"AndroidManifest.xml에 다음 나는 오류를 모두 제거

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

4

이미지를 더 작은 크기로 조정하여이 문제를 해결했습니다. xamarin 양식을 사용하고 있습니다. PNG 이미지의 크기를 줄이면 문제가 해결되었습니다.


4

문제 : OOM까지 16777120 여유 바이트 및 17MB의 37748748 바이트 할당을 할당하지 못했습니다.

해결책 : 1. 매니페스트 파일을 엽니 다. 2. 응용 프로그램 태그 내부에 두 줄 아래 만 추가하십시오.

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

예 :

 <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

'드로어 블'폴더의 이미지가 고화질 전화에서 훨씬 더 큰 이미지로 변환된다는 것을 알았습니다. 예를 들어 200k 이미지는 800k 또는 32000k와 같은 고해상도로 리샘플링됩니다. 나는 이것을 스스로 발견해야했고 현재 까지이 힙 메모리 트랩에 대한 문서를 보지 못했습니다. 이를 방지하기 위해 모든 장치를 drawable-nodpi 폴더에 넣었습니다 (특정 장치 힙을 기반으로 BitmapFactory에서 '옵션'사용). 특히 화면 정의 범위가 너무 커서 앱의 크기를 여러 드로어 블 폴더로 부 풀릴 여유가 없습니다. 까다로운 점은 스튜디오가 프로젝트 뷰에서 'drawable-nodpi'폴더를 구체적으로 나타내지 않고 'drawable'폴더 만 표시한다는 것입니다. 주의하지 않으면 스튜디오에서이 폴더에 이미지를 놓으면 이미지가

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.

여기에 이미지 설명을 입력하십시오

대화 상자에서 nodpi 폴더를 아래로 클릭하십시오. 프로젝트보기에는 이전과 같이 모든 드로어 블 폴더가 표시되지 않으므로 잘못된 폴더로 갔다는 것이 즉시 명백하지 않습니다. Studio는 오래 전에 삭제 한 후에 바닐라 'drawable'을 어느 시점에서 다시 만들었습니다.

여기에 이미지 설명을 입력하십시오


3

이것은 나를 위해 일했습니다 : 이미지를 drawable 폴더에서 drawable-hdpi로 옮기십시오.


이것에 대한 설명은 무엇입니까? 왜 이런 움직임이 작동합니까?
하룬

pls는 왜 이것이 작동하는지 설명합니까?
X-Black ...

3

Soluton은 매니페스트 파일에서 이것을 시도하고 글라이드 라이브러리를 사용하십시오.

'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 : hardwareAccelerated = "false"

android : largeHeap = "true"

<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">

이 라이브러리를 사용하십시오

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

그것의 행복한 코딩 작업

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

응용 프로그램에서 매니페스트에 이것을 추가 하시겠습니까? android : largeHeap = "true"


또한 높이 = 높이 * .75 및 너비 = 너비 * .75 : 하나 더 해결책이 있습니다.
SAURABH OMER 12

2

나도 문제가 있었다.

위의 다른 대부분과 동일합니다. 큰 이미지 때문에 문제가 발생합니다.

일부 이미지의 크기를 조정하기 만하면 코드를 변경할 필요가 없습니다.



1

나는 안드로이드 개발의 초보자이지만 내 솔루션이 도움이되기를 바랍니다. 내 조건에서 완벽하게 작동합니다. 프레임 뷰 애니메이션을 만들려고하기 때문에 Imageview를 사용하고 배경을 "src"로 설정했습니다. 나는 같은 오류가 있지만 이것을 코딩하려고했을 때 효과가 있었다.

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

1

새로운 활동으로 넘어갈 때 이전 활동을 중단시키지 않으면이 문제가 발생했습니다. 나는 그것을 고쳤다finish();

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

100/100을 사용하면 원래 해상도로 인해 메모리 부족으로 인해 앱이 중지 될 수 있습니다.

50 이하인 경우 100 % 이하의 해상도이므로 메모리 부족 문제를 방지 할 수 있습니다.


1

드로어 블에서 객체의 크기를 변경해야합니다. 안드로이드가 표시하기에는 너무 큽니다. 예를 들어 이미지를 설정하는 경우 더 적은 픽셀로 이미지를 시도하십시오. 그것은 나를 위해 작동합니다. 감사. :)


1

이미지 크기 (MB 또는 KB) 가 너무 커서 앱을 위한 공간이 할당되지 않아 앱이 다운 되고 있습니다. 따라서 이미지를 드로어 블에 붙여 넣기 전에 크기를 줄이십시오.

또는

Manifest.xml의 애플리케이션 태그에 팔로 잉을 추가 할 수 있습니다.

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

이 앱을 추가 한 후에는 충돌하지 않습니다.

  • 항상 앱에서 더 작은 크기의 이미지를 사용하십시오.
  • app에 큰 크기의 이미지를 추가하는 경우 위의 syntex를 추가해야하지만 앱 크기는 증가합니다.


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

이미지를 업로드하는 경우 비트 맵의 ​​두 번째 매개 변수 인 이미지 품질을 낮추십시오. 이것이 내 경우의 해결책이었습니다. 이전에는 90이었고 60으로 시도했습니다 (지금 아래 코드와 동일).

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

0

가장 간단한 것을 시도하십시오. 이미지 크기 (MB)가 너무 커서 앱을위한 공간이 할당되지 않아 앱이 다운되었을 수 있습니다. 따라서 이미지를 드로어 블에 붙여 넣기 전에 뷰어 소프트웨어로 크기를 줄이거 나 런타임에 갤러리에서 이미지를 저장하는 경우 이미지를 저장하기 전에 비트 맵을 압축하십시오. 그것은 나를 위해 일했다. 분명히 당신을 위해.


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

그런 다음 Appliaction 태그에 largeheapsize = "true를 추가하십시오.


0

이 이미지를 아이콘으로 사용하고 싶다고 가정합니다. Android가 말한 것처럼 이미지가 너무 큽니다. 당신이해야 할 일은 안드로이드가 이미지의 크기와 화면 해상도에 따라 알 수 있도록 이미지의 크기를 조정하는 것입니다. 이를 위해 Android Studio에서 : 1. res 폴더를 마우스 오른쪽 버튼으로 클릭하고, 2. 이미지 자산을 선택하십시오. 3. 아이콘 유형을 선택하십시오. 4. 아이콘 이름을 지정하십시오. 5. 아이콘을 자산 유형으로 선택하십시오. . xml 또는 소스 코드에서 선택된 자산 유형에 따라 레이아웃 또는 밉맵 폴더에있는 이미지를 참조하십시오. 오류가 사라집니다.


0

나는 이런 식으로 매니페스트를 편집하는 것을 권장하지 않습니다.

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

이러한 옵션은 앱에 부드러운 애니메이션 효과를주지 않습니다. 또한 'liveData'또는 로컬 DB (Sqlite, Room) 변경이 느리게 활성화됩니다. 사용자 경험에 좋지 않습니다.

그래서 RESIZE 비트 맵을 추천합니다

아래는 샘플 코드입니다

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.