2014-11-22 33 views
5

Uygulamam, kullanıcının bir resmi düzenlemesine izin veriyor. Görüntü, "dilimler" halinde düzenlenir: Kullanıcı, düzenlemek için büyük resmin bir bölümünü seçer (1), kullanıcı düzenler (2, 3) ve kullanıcı bittiğinde, düzenlenmiş dilim orijinalin üzerine geri kopyalanır. görüntü (4). Aşağıdaki resimde basitleştirilmiş prosedürü görebilirsiniz. drawBitmap, saydam bir bitmap ile kanvaslamak için orijinal pikselleri değiştirin

  • Sample workflow

    ben bir kullanıcı düzenlemeleri (2,3) kırpılmış bölgenin bir bitmap, oluşturma dilim düzenleyin.

  • Kullanıcı bittiğinde, orijinal görüntüye dilimi (0) drawBitmap(). Süreç daha karmaşıktır çünkü orijinal görüntünün bir dönüşüm matrisi vardır, tersine çevirmek zorundayım, ama basitlik uğruna bu yeterlidir.

kullanıcı dilim (3) bazı piksellerin temizler sorun ortaya çıkar. Uygun bir PorterDuff/Paint modunu bulamıyorum, böylece düzenlenmiş dilim, orijinal görüntüdeki kısmı, saydam piksellerde bile değiştirir. İstediğim sonuç (4)

Benim iyi bahis bugüne kadar PorterDuff.SRC kullanmaktır de tasvir almak için, ancak aşağıdaki resimde gördüğünüz gibi, şeffaf pikseller orijinal görüntüdeki Siyah açın. Boya rengini Şeffaf olarak ayarlarsam, sonuç siyah olur.

mBlitPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); 
    mImageCanvas.drawBitmap(mArenaBitmap, invertedMatrix, mBlitPaint); 

Ben de SRC_OVER ve hatta mImageCanvas.drawARGB (0xff,0,0,0), ama hiçbir şans çalıştı. İlk durumda, saydam pikseller göz ardı edilir. İkincisi, şeffaf pikseller siyah boyanır. Ben de bu sorun vardı ve bir çözüm bulamadı

Sample result

cevap

0

, neyse ki amacım aslında düzenleyebilir ve bu ... ben farklı katmanları kullanılan kurtarmak için değil bir şeyler göstermek içindi ve o gibiydi iş. ama bunun için bir çözüm bulursanız nasıl yaptığınızı bilmek isterdim

+0

ne yazık ki farklı katmanlar bir seçenek değildir, bu çok karmaşık bir sürüm programın filtreleri, opengl, vs ile ilgilidir. çok fazla şey değiştirmeden problem – rupps