Konversi .JFIF ke .JPG dengan Python

Halo, assalamualaikum. Pada artikel ini yang dibahas berbeda dari biasanya 😀 Sebenarnya, dulu saya sering melakukan hal yang sama saat sekolah. Jadi ketika ada satu part yang bermasalah dicatat di blog ini untuk dokumentasi. Kalau dokumentasi ini dirasa berguna juga buat yang lain, ya alhamdulillah 😀 Berhubung saat ini sedang sekolah, mari digalakkan kembali.:D Jadi, ini ceritanya, seharian kemarin saat menjalankan program selalu error, errornya bisa berganti-ganti, terakhir sampai tengah hari ini saya hampir menyerah 😀 *padahal dulu saat pertama bisa ngoding bisa nemu solusi dari error sampai seminggu. Tak apa lah ya 😀 Singkat cerita error saya berawal dari kesalahan ekstensi yang tidak seragam dalam satu direktori, sehingga tidak bisa diakses fail tersebut. Mau edit satu per satu kok rasanya makan waktu, yasudah yuk cus dikoding saja 😀

Pernah nemu error semacam ini gak? Terakhir error yang saya terima seperti ini.

InvalidArgumentError: Graph execution error:

2 root error(s) found.
  (0) INVALID_ARGUMENT:  jpeg::Uncompress failed. Invalid JPEG data or crop window.
	 [[{{node decode_image/DecodeImage}}]]
	 [[IteratorGetNext]]
	 [[IteratorGetNext/_2]]
  (1) INVALID_ARGUMENT:  jpeg::Uncompress failed. Invalid JPEG data or crop window.
	 [[{{node decode_image/DecodeImage}}]]
	 [[IteratorGetNext]]
0 successful operations.
0 derived errors ignored. [Op:__inference_train_function_86767]

Setelah mencari-cari referensi, ketemulah referensi yang sesuai dengan kebutuhan. Kurang lebih begini caranya untuk konversi citra dari .JFIF ke .JPG. Awalnya, kita konversi ekstensi fail dari suatu direktori sesuai dengan (#1.), setelah itu kita hapus semua fail yang berekstensi .JFIF dalam direktori tersebut.

from PIL import Image
directory = "new_data/potato_1/"
import os
dir_name = directory
test = os.listdir(dir_name)

# 1. Convert .jfif file to JPG
extension = ".jfif"
for root, dirs, files in os.walk(directory, topdown=False):
    for name in files:
        print(os.path.join(root, name))
        if os.path.splitext(os.path.join(root, name))[1].lower() == extension:
            if os.path.isfile(os.path.splitext(os.path.join(root, name))[0] + ".jpg"):
                print()
            else:
                outfile = os.path.splitext(os.path.join(root, name))[0] + ".jpg"
                im = Image.open(os.path.join(root, name))
                print()
                im.thumbnail(im.size)
                im.save(outfile, "JPEG", quality=100)

# 2. Removing .jfif files
for item in test:
    if item.endswith(extension):
        os.remove(os.path.join(dir_name, item))

Apakah masih trouble? Jika iya, setelah menjalankan baris koding di atas, sekarang coba jalankan baris kode berikut:

bads = []
directory = "new_data1/sweet_potato_1/"
dir_name = directory
test = os.listdir(dir_name)
for root, dirs, files in os.walk(directory, topdown=False):
    for img in test:
      image = os.path.join(root, img)
      print(image)
      image = JPEG(image)
      try:
        image.decode()
      except:
        bads.append(img)


for name in bads:
  os.remove(os.path.join(dir_name, name))

Baris kode di atas untuk melakukan cross check apakah ada file JPG yang corrupt atau tidak. Jika iya maka file yang corrupt itu akan dihapus.

Duh, masih error lagi ya, yuk mari kita cek bersama, apakah fail-fail yang ekstensinya kita konversi tersebut sudah bisa diterima oleh Tensorflow untuk kemudian dijalankan kembali? Baik kita cek seperti ini ya:

from pathlib import Path
import imghdr

data_dir = DATADIR
image_extensions = [".png", ".jpg"]  # add there all your images file extensions

img_type_accepted_by_tf = ["bmp", "gif", "jpeg", "png"]
for filepath in Path(data_dir).rglob("*"):
    if filepath.suffix.lower() in image_extensions:
        img_type = imghdr.what(filepath)
        if img_type is None:
            print(f"{filepath} is not an image")
        elif img_type not in img_type_accepted_by_tf:
            print(f"{filepath} is a {img_type}, not accepted by TensorFlow")

Nah, nanti akan terlihat fail apa saja yang tetap tidak bisa dibaca. Langkah terakhir karena kita sudah tahu failnya apa saja, tinggal dihapus manual saja. Tak banyak sih, dalam kasus saya dari 824 files yang dikonversi, 2 fail yang akhirnya tetap tidak bisa dibaca meski sudah dikonversi dan dihilangkan fail yang corruptnya. Selamat mencoba 🙂

Jika males ngoding boleh sih tinggal pakai tool ini https://converseen.fasterland.net/

Semoga bermanfaat ya, meski tak seberapa 😉 Yuk, lanjut ngoding lagi 😀

At lab, sedang semedi 😀

Referensi:

Leave a Reply

Your email address will not be published. Required fields are marked *