HiAI Image - Picasso와 Kotlin의 초고해상도

10744 단어
Las imágenes se comprimen en una proporción alta para su almacenamiento y transferencia para ahorrar espacio de almacenamiento y reducir el tráfico. 결과에 따라 이미지가 손상되고, 혜택이 줄어듭니다.

Para este artículo, usaremos la superresolución de imagen HiAI de Huawei para mejorar la calidad de una imagen que se descargó en baja resolución con Picasso.

Picasso es una potente biblioteca de descarga y almacenamiento en caché de imágenes para Android. Usaremos la propiedad de Picasso para descargar imágenes para mostrar en una galería y mantenerlas en caché, para evitar hacer una segunda descarga para mantener la imagen en mayor resolución. Usando Huawei HiAI Image Super-Resolution para mejorar la calidad de imagen y mostrar estas imágenes con mejor calidad en una pantalla detallada.

Puedes obtener más información sobre la super resolución de Huawei HiAI: https://developer.huawei.com/consumer/en/doc/20201101

1.- AGC에 등록 및 적용 생성
https://developer.huawei.com/consumer/en/codelab/HMSPreparation/index.html#0

2.-투 엔토르노 드 트라바호 구성
DevEco IDE를 보완하는 설치
파일 -> "설정"-> "플러그인"-> "리포지토리 찾아보기..."를 클릭합니다.

Ingresa "DevEco IDE"para buscar el complemento e instalarlo.

3.- Agregar biblioteca de dependencycias
Vision-release.aar en los SDK de Huawei AI Engine de la comunidad de desarrolladores de Huawei.

Copia el paquete vision-release.aar descargado en el directorio app/libs del proyecto.


푸에데스 세귀르:
https://developer.huawei.com/consumer/en/doc/development/hiai-Guides/20201103#h1-2-use-instructions
Agrega la Dependencia de Picasso y HiIA Vision:

implementation(name: 'huawei-hiai-vision', ext: 'aar')
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.google.code.gson:gson:2.8.5'


4.- 초기화 화웨이 HiAi
En la clase Application, cree una función initHiAi() 및 impleméntela en el método onCreate()

private fun initHiAi() {
    VisionBase.init(applicationContext, object : ConnectionCallback {
        override fun onServiceConnect() {
            Log.i(TAG, "onServiceConnect")
        }
override fun onServiceDisconnect() {
            Log.i(TAG, "onServiceDisconnect")
        }
    })
}


5.- Agregar RecyclerView

En activity_main.xml agregamos un RecyclerView

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/galleryRecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />


6.- Crea el Adaptador RecyclerView 생성
Crear la class GalleryAdapter

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import com.squareup.picasso.Picasso
class GalleryAdapter(
    private val images: Array<String>,
    val itemClickListener: (String) -> Unit
) :
    RecyclerView.Adapter<GalleryAdapter.GalleryViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GalleryViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false)
        return GalleryViewHolder(view)
    }
override fun getItemCount(): Int {
        return images.size
    }
override fun onBindViewHolder(holder: GalleryViewHolder, position: Int) {
        val imageView = holder.galleryImageView
        Picasso.get()
            .load(images[position])
            .placeholder(R.drawable.logo)
            .error(R.drawable.logo_black)
            .into(imageView)
    }
inner class GalleryViewHolder(itemView: View) :
        RecyclerView.ViewHolder(itemView) {
        val galleryImageView: ImageView = itemView.findViewById(R.id.imageItemView)
init {
            galleryImageView.setOnClickListener {
                itemClickListener.invoke(images[adapterPosition])
            }
        }
    }
}


7.-Cear administrador de superresolución de imágenes
La superresolución de imágenes HiAI tiene una limitación, ya que solo puede tratar imágenes con una resolución igual or lower a 800 * 600.

import android.content.Context
import android.graphics.Bitmap
import com.huawei.hiai.vision.image.sr.ImageSuperResolution
import com.huawei.hiai.vision.visionkit.common.Frame
import com.huawei.hiai.vision.visionkit.image.sr.SuperResolutionConfiguration
import java.util.concurrent.Executors
class HiAiImageSuperResolutionManager(applicationContext: Context) {
private var imageSuperResolution: ImageSuperResolution =
        ImageSuperResolution(applicationContext)
companion object {
        private const val THREADS_COUNT = 10
        private const val MAX_WIDTH = 800
        private const val MAX_HEIGHT = 600
    }
private val executor = Executors.newFixedThreadPool(THREADS_COUNT)
fun doSuperResolutionAsync(bitmap: Bitmap, onImageListener: (Bitmap?) -> Unit) {
        executor.execute {
            onImageListener.invoke(doSuperResolution(bitmap))
        }
    }
private fun doSuperResolution(source: Bitmap): Bitmap? {
        if (imageSuperResolution.prepare() != 0) return source
        return if (source.width <= MAX_WIDTH && source.height <= MAX_HEIGHT) {
            getSuperResolutionBitmap(source)
        } else {
            source
        }
    }
private fun getSuperResolutionBitmap(source: Bitmap): Bitmap? {
        val frame = Frame().apply {
            bitmap = source
        }
        val result = getSuperResolutionInstance().doSuperResolution(frame, null).bitmap
        return result
    }
private fun getSuperResolutionInstance(): ImageSuperResolution {
        val params = SuperResolutionConfiguration(
            SuperResolutionConfiguration.SISR_SCALE_3X,
            SuperResolutionConfiguration.SISR_QUALITY_HIGH
        )
        imageSuperResolution.setSuperResolutionConfiguration(params)
return imageSuperResolution
    }
}


8.- 세부 활동 생성

DetailActivity mostrará la imagen almacenada en caché y la imagen que ha sido procesada y mejorada con HiAI Image Super-Resolution.

import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.squareup.picasso.Picasso
import com.squareup.picasso.Target
import kotlinx.android.synthetic.main.activity_detail_gallery.*
@Suppress("DEPRECATION")
class DetailActivity : AppCompatActivity() {
companion object {
        private const val EXTRA_PHOTO_CACHE = "ExtraPhotoCache"
        private const val TAG = "UiAiDetailActivity"
    }
private lateinit var imageUrl: String
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_detail_gallery)
        imageUrl = intent.getStringExtra(EXTRA_PHOTO_CACHE).toString()
    }
override fun onStart() {
        super.onStart()
        Picasso.get()
            .load(imageUrl)
            .placeholder(R.drawable.logo)
            .error(R.drawable.logo_black)
            .into(object : Target {
                override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
                    Log.i(TAG, "onPrepareLoad")
                }
override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) {
                    Log.i(TAG, "onBitmapFailed")
                }
override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {
                    Log.i(TAG, "onBitmapLoaded")
                    if (bitmap != null) {
                        imageNoResolution.setImageBitmap(bitmap)
                        HiAiImageSuperResolutionManager(applicationContext).doSuperResolutionAsync(
                            bitmap
                        ) {
                            imageResolution.setImageBitmap(it)
                        }
                    }
                }
            })
    }
}


9.- RecyclerView 구현

Instala y configura el adaptador en la vista del reciclador dentro de la Actividad principal

val images = resources.getStringArray(R.array.url_resources)
galleryRecyclerView.apply {
    this.setHasFixedSize(true)
    this.layoutManager = GridLayoutManager(this@MainActivity, 2)
    adapter = GalleryAdapter(images) { url ->
        val intent = Intent(this@MainActivity, DetailActivity::class.java).apply {
            this.putExtra("ExtraPhotoCache", url)
        }
        startActivity(intent)
    }
}


10.- Ejecutar y probar
Después de ejecutar la aplicación, la Actividad principal muestra la Galería, mostrando las imágenes descargadas en tamaño real.


Cuando haces clic en una imagen, la actividad de detalles muestra la misma imagen obtenida de la caché de Picasso en un contenedor más grande.


Como puede observar, la imagen superior está distorsionada, y la lower después del procesamiento de superresolución de imagen HiAI muestra una imagen más clara y nítida.
Por lo tanto, podemos mejorar la experiencia del usuario mediante el uso de imágenes más pequeñas que lo hacen descargable y mejoran la experiencia del usuario.
Puedes descargar el proyecto:
https://github.com/jordanrsas/ImageSuperResolution

좋은 웹페이지 즐겨찾기