ExifInterface haqida

ExifInterface haqida

Quvonchbek Yangiboyev
Rasm mindorks.com saytidan olindi.

Ilovalarimizda rasmlardan keng foydalanamiz. Rasmga oid ba'zi ilovalar uchun rasmlarning barcha tafsilotlari talab qilinadi. Ammo biz tasvirlarning tafsilotlarini har doim to'g'ridan-to'g'ri tasvirdan o'qiy olmaymiz. GPS joylashuvi, sana / vaqt, suratga olish vaqtidagi sozlamalar, yo'nalish va h.k.lar kabi tasvir tafsilotlarini bilishingiz kerak bo'lishi mumkin.

Ilgari biz rasm ma'lumotlarini olishga qiynalgan edik, buning uchun metadata-ni turli usullardan ajratib olib, Image xususiyatlarini tushunish uchun o'qishimiz kerak edi. Garchi biz o'qiyotgan bo'lsak ham, GPS yorliqlarini olib tashlash yoki yo'nalishni o'zgartirish kabi tasvirlardagi o'zgarishlar qiyin vazifalar bo'lishi mumkin edi.

Buning echimi Exif fayllari va ExifInterface.


EXIF nima ekanligini tushunib olamizmi? qani unda boshladik.


Exif nima?

Exif almashinadigan rasm fayllari formati degan ma'noni anglatadi . Bu telefon yoki kamera tomonidan olingan rasmlarni aniq ma'lumotlarni aniqlaydigan standart. U kameraga ta'sir qilish, rasm olingan sana / vaqt va hattoki GPS joylashuvi kabi muhim ma'lumotlarni saqlashga qodir. Namuna Exif fayli quyidagicha,

Exifni ko'rinishi

Agar yuqoridagi rasmga qarasangiz, bizda tasvirning uzunligi va kengligi, olingan sana va vaqt, shu rasm qaysi qurilmadan olinganligi, orientatsiya kodi va ba'zi tasvirlar yorug'lik, oq rang balansi, fokus masofasi kabi atributlarimiz mavjud. , agar flesh yonib tursa yoki yoqilmagan bo'lsa, tasvirning GPS ma'lumoti, ya'ni olingan joyning uzunligi. Bunga qarab biz tasvirning to'liq tafsilotlarini olishimiz mumkin. Endi siz EXIF ​​fayllari haqida qisqacha fikrga ega bo'ldingiz.


Android-dagi ExifInterface

Biz Exif nima ekanligini va uning tarkibida nima borligini angladik. Keling, Android-dagi rasmlardan Exif ma'lumotlarini qanday qilib olishimiz mumkinligini ko'rib chiqamiz. ExifInterface Android qo'llab-quvvatlash kutubxonasida 25.1.0 dan beri joriy qilingan. Garchi bu 7.1 dan beri mavjud bo'lsa ham, Android 9+ dan interfeysda taqdim etilgan barcha imkoniyatlar bor edi. Bu rasmlarning Exif teglarini o'qish uchun 100+ atributlar bilan qo'shilgan, shu jumladan kameraning o'zi, kamera sozlamalari, yo'nalishi va GPS koordinatalari haqida ma'lumot. Hozircha u faqat JPEG fayllarini yoki RAW rasm faylini o'qiy oladi. Qo'llab-quvvatlaydigan formatlar JPEG, DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW, RAF va HEIF.

Agar ExifInterface-dan foydalanmoqchi bo'lsangiz, build.gradle-ga quyidagi bog'liqlikni qo'shishingiz kerak.

  
implementation "androidx.exifinterface:exifinterface:1.3.1"

Exif ma'lumotlarini tushunishning muhim jihati shundaki, talab qilinadigan teglar yo'q: har bir teg majburiy emas - ba'zi xizmatlar hatto Exif ma'lumotlarini maxsus ravishda echib tashlaydi. Shuning uchun sizning kodingiz davomida siz Exif ma'lumotlari bo'lmagan holatlarni ko'rib chiqishingiz kerak, chunki ma'lum bir atribut uchun ma'lumotlar yo'qligi yoki Exif ma'lumotlarini umuman qo'llab-quvvatlamaydigan rasm formati (masalan, hamma joyda mavjud bo'lgan PNG yoki WebP rasmlari).

Endi ExifInterface yordamida turli xil manbalar uchun EXIF ​​atributlarini va ba'zi foydalanish holatlarini qanday o'qishimiz mumkinligini tushunib olaylik. Ko'pgina atributlar uchun mos ravishda getAttributeInt (), getAttributeDouble () yoki getAttribute () usullaridan foydalanishingiz mumkin.


Uri kontentidan ma'lumot olish

Uri uri; // the URI you've received from the other app
InputStream in;
try {
    in = getContentResolver().openInputStream(uri);
    ExifInterface exifInterface = new ExifInterface(in);
    // Now you can extract any Exif tag you want
    // Assuming the image is a JPEG or supported raw format
} catch (IOException e) {
    // Handle any errors
} finally {
    if (in != null) {
        try {
            in.close();
        } catch (IOException ignored) {}
    }
}


Eslatma: ExifInterface masofaviy InputStreams bilan ishlamaydi, masalan, HttpURLConnection. Ulardan faqat content: // yoki file: // bilan foydalanish tavsiya etiladi.


Kamera ilovalari uchun

Kamera dasturlari uchun tasvirni yozish atributlari muhimroq. Hozirga kelib, u hali ham JPEG rasmlari bilan cheklangan. ExifInterface yordamida biz allaqachon o'rnatilgan JPEG_ORIENTATION, JPEG_GPS_LOCATION yoki unga teng keladigan narsani osongina o'zgartirishimiz mumkin. Shuningdek, biz ushbu xususiyatlarni foydalanuvchining so'rovi asosida olib tashlashimiz mumkin.

var exif : ExifInterface = ExifInterface(pictureFile.getAbsolutePath())
exif.setAttribute(ExifInterface.TAG_ORIENTATION, "" + getPhotoOrientation(configurationProvider.getSensorPosition()))
exif.saveAttributes()

Yo'nalishni boshqarish

Rasmlarni namoyish qilishda eng muhim xususiyatlardan biri bu ORIENTATION_ va TAG_ORIENTATION mos nomida saqlangan rasm yo'nalishi. Buni burilish burchagiga aylantirish uchun siz ushbu kodga qarang.

int rotation = 0;
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
switch (orientation) {
    case ExifInterface.ORIENTATION_ROTATE_90:
    rotation = 90;
    break;
    case ExifInterface.ORIENTATION_ROTATE_180:
    rotation = 180;
    break;
    case ExifInterface.ORIENTATION_ROTATE_270:
    rotation = 270;
    break;
}

Exif burilish burchagi yordamida bitmap aylanishi

Birinchidan, ExifInterface-ni yarating:

ExifInterface exif = new ExifInterface(uri.getPath());

Keyin, ORIENTATION bering:

int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);

Exif aylanishini darajaga aylantirish:

int rotationInDegrees = exifToDegrees(rotation);

yuqoridagi ExitToDegress funksiyasini yozilishi

private fun exifToDegrees(exifOrientation: Int): Int {
    if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) {
        return 90
    } else if (exifOrientation ==   ExifInterface.ORIENTATION_ROTATE_180) {
        return 180
    } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {
        return 270
    }
    return 0
}

Keyin rasmni Matritsa yordamida aylantirish uchun mos yozuvlar nuqtasi sifatida rasmning haqiqiy aylanishidan foydalaning.

Matrix matrix = new Matrix();
if (rotation != 0) {
    matrix.postRotate(rotationInDegrees);
}

Matritsani parametr sifatida qabul qiladigan Bitmap.createBitmap usuli bilan siz yangi aylantirilgan rasmni yaratasiz:

Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)

matrixyangi rotatsiyani qaerda ushlab turadi:

Bitmap adjustedBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, width, height, matrix, true)


ExifInterface-dan qanday foydalanishimiz mumkinligi haqida ba'zi foydalanish holatlari.

  • ExifInterface rasm olinganida rasm ma'lumotlarini yozishda ishlatiladi. Rasmni telefon xotirasiga saqlash paytida yo'nalishni boshqarish ham foydalidir.
  • Tasvir hajmini kichraytirishimiz va Exif ma'lumotlarini yangilashimiz kerak bo'lishi mumkin, buning uchun Exif ma'lumotlarini olishimiz va yangilangan ma'lumotlarni rasmga saqlashimiz kerak bo'ladi.
  • ExifInterface shuningdek, rasm sarlavhalarini olish va tahlil qilish uchun ishlatiladi.
  • Qurilma aylantirilganda qurilmaning ko'rinishini doimiy ravishda ushlab turish.
  • Gallereyadan rasmni olish va uni tegishli yo'nalish va tasvir saqlangan boshqa xususiyatlar bilan namoyish etish.

Bularning barchasi ExifInterface haqida edi. Biz bugun ExifInterface haqida bilib oldik. Mavzuni biroz yoritib berishga umid qilaman.


O'rganishni davom eting, o'rganishni davom eting va o'sishda davom eting

O'qiganingiz uchun Rahmat.


Maqola tayyorlashda foydalanilgan manbalar:

https://blog.mindorks.com/exifinterface


Kanalimizga obuna bo'ling va maqolani do'stlaringiz bilan ham ulashing:

@YashilRobot


Report Page