Projemde galeriden ve facebooktan çektiğim resimler üzerinde efekt uygulama ,crop gibi basit işlemler yapmak istiyorum. Seçtiğim resimleri pathlerinden indiriyorum/çekiyorum. Bu resimleri 1.listede tutuyorum. Değişiklikleri ilk listedeki bitmaplerde yapıyorum.Uyguladığım değişiklikleri geri almak için kullandığım 1. listemin kopyası olan 2. bir listem var. Değişiklikleri geri aldığım zaman 2. listeden ilgili indisteki bitmapi 1 listeye atıyorum ve değişiklikler iptal oluyor. işlem sonunda 1 listedeki bitmapleri veritabanına yazıyorum.Uygulama ana hatlarıyla bu şekilde.

Problem su;

Galerideki resimleri çekmek için kulandığım fonksiyon resmi orjinal boyutlarında getirmiyor.

public static Bitmap getImageWithoutOutOfMemory(String filePath,int requiredSize) {
    // Decode image size
    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inJustDecodeBounds = true;
    o.inMutable = true;
    o.inPreferredConfig = Bitmap.Config.ARGB_8888;
    BitmapFactory.decodeFile(filePath, o);

    // The new size we want to scale to
    final int REQUIRED_SIZE = requiredSize;

    // Find the correct scale value. It should be the power of 2.
    int width_tmp = o.outWidth, height_tmp = o.outHeight;
    int scale = 1;
    while (true)
    {
        if (width_tmp <= REQUIRED_SIZE && height_tmp <= REQUIRED_SIZE)
            break;
        width_tmp /= 2;
        height_tmp /= 2;
        scale *= 2;
    }

    // Decode with inSampleSize
    BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inSampleSize = scale;
    Bitmap img = BitmapFactory.decodeFile(filePath, o2);
    return img;
}

2mb lik resmi 200 kb gibi bir boyutta getiriyor.

Birde şu şekilde getirdim:

MediaStore.Images.Media.getBitmap(getContentResolver(), Uri.fromFile(new File(path)));

ilk fonksiyonda resmin kalitesi bozuluyor. ikinci kodda ise aldığım resmi veritabanına yazamıyorum.

İnternetten aldığım resimlerde de boyut sorunu oluyor orda yaptığım işlem şu şekilde;

  BitmapFactory.Options bmOptions;
                bmOptions = new BitmapFactory.Options();
                bmOptions.inJustDecodeBounds = true;
                //from web
                try {
                    Log.i(TAG,""+g.getPath());
                    InputStream is = new URL(g.getPath()).openStream();
                    BitmapFactory.decodeStream(is, null, bmOptions);
                    is.close();
                    BitmapFactory.Options o2 = new BitmapFactory.Options();
                    o2.inSampleSize = 2;
                    o2.inMutable = true;
                    is = new URL(g.getPath()).openStream();
                    bitmap = BitmapFactory.decodeStream(is, null, o2);
                    is.close();

Bu işlemleri aşmam durumunda karşıma cıkacak bir diğer durum ise 40 civarı orjinal boyutlarındaki resim üzerinden bu işlemler OOM hatası almadan nasıl halledebilirim.?

soruldu: 11 Haz '15, 11:10

sgurdag's gravatar image

sgurdag
767713
cevap kabul oranı: 50%


Direk kod olarak cevap istemediğini varsayarak yazıyorum, zaten androidde programlamadığım için malesef yazamam da :)

OOM hatasını önlemek için algoritmanı şu şekilde değiştirirsen muhtemelen problemi çözersin. Aldığın her bir resmi binarywriter kullanarak temp dosyası olarak sabit diske veya direk resim halinde veritabanına yaz ve resim ile ilgili işlem yapılmak istendiğinde hangi resim gerekliyse sadece onu veritabanından/sabit diskten al. Böylece ramde sadece 2 tane resim tutmuş olursun. Bu senin resimler arasında gezinme hızını düşürücektir ama bence bu yöntem bu tür bir iş için daha verimli olur. Yüksek donanımlı telefonlarda sıkıntı yaşamazsın ama en basitinden benim telefonum samsung ace, 290 rami var boşta 235le çalışıyor, 40 tane büyük resim kalan 55 mb yi muhtemelen doldurur ve OOM hatasını alırsın.

permanent link

cevaplandı: 11 Haz '15, 16:22

ArnesTwin's gravatar image

ArnesTwin
1.1k1511
cevap kabul oranı: 14%

değiştirildi: 11 Haz '15, 16:24

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×819
×3
×2

Soruldu: 11 Haz '15, 11:10

Görüntüleme: 387 kez

Son güncelleme: 11 Haz '15, 16:24

powered by BitNami OSQA