gpt4 book ai didi

java - 在 SQliteDatabase 中保存图像时出现 OutOfMemoryError

转载 作者:行者123 更新时间:2023-12-01 18:02:50 25 4
gpt4 key购买 nike

我在 sqlite 数据库中保存图像时遇到此错误,图像大小仅为 240KB 我已经尝试了一些解决方案,但无法解决此问题我在数据库中保存和获取图像的代码

public class MainActivity extends AppCompatActivity {

SQLiteDatabase db;
ImageView img,img_get;
Button btn_save,btn_get;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img=(ImageView)findViewById(R.id.img_save);
img_get=(ImageView)findViewById(R.id.img_get);
btn_get=(Button)findViewById(R.id.btn_get);
btn_save=(Button)findViewById(R.id.btn_save);
db= openOrCreateDatabase("Mydb", MODE_PRIVATE, null);
db.execSQL("create table if not exists hello(name varchar, a blob)");


btn_save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
saveimage(v);

}
});

btn_get.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
getimage(v);
}
});
}
public void saveimage(View view)
{
byte[] image=new byte[R.drawable.red];
ContentValues value=new ContentValues();
value.put("name","hatib abrar");
value.put("a",image);
db.insert("hello",null,value);
Toast.makeText(getApplicationContext(),"Saved",Toast.LENGTH_SHORT).show();
}
public void getimage(View view)
{
Cursor c=db.rawQuery("select * from hello",null);
if (c.moveToNext())
{
String name=c.getString(0);
byte[] image=c.getBlob(1);
Bitmap bm= BitmapFactory.decodeByteArray(image,0,image.length);
img_get.setImageBitmap(bm);
Toast.makeText(getApplicationContext(),"Error getting image",Toast.LENGTH_SHORT).show();
}

}

LogCat 显示此错误 throw

OutOfMemoryError "Failed to allocate a 2130837597 byte allocation with 16777216 free bytes and 151MB until OOM" 09-07 09:49:59.651 21823-21823/com.example.e6530.imagesaving D/AndroidRuntime: Shutting down VM 09-07 09:49:59.651 21823-21823/com.example.e6530.imagesaving E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.e6530.imagesaving, PID: 21823 java.lang.OutOfMemoryError: Failed to allocate a 2130837597 byte allocation with 16777216 free bytes and 151MB until OOM at com.example.e6530.imagesaving.MainActivity.saveimage(MainActivity.java:51) at com.example.e6530.imagesaving.MainActivity$1.onClick(MainActivity.java:36) at android.view.View.performClick(View.java:4793) at android.view.View$PerformClick.run(View.java:19971) 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:5669) 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:960) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

最佳答案

您的问题在这一行:

byte[] image=new byte[R.drawable.red];

R.drawable 通常是一些大整数。例如 10 亿,因此您尝试创建十亿字节的数组。而且内存很大。请不要将资源 ID 作为数组大小传递。

已更新

请参阅this回答并 this页来处理如何从资源检索位图并将其转换为字节数组。可能你需要写一些类似的东西:

Resource r = ...;
Bitmap bitmap = Bitmap.decodeResource(r, R.drawable.red);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] bitmapdata = stream.toByteArray();

关于java - 在 SQliteDatabase 中保存图像时出现 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39362706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com