Как загрузить файл Raw .NEF в QImage, не сохраняя его в Python - PullRequest
2 голосов
/ 19 сентября 2019

Для начала дела.Я новичок в работе с изображениями Python.Но я довольно хорош в Python в целом.Но я не могу найти хорошее решение для отображения файлов RAW .NEF с камеры Nikon в Python.Я хочу открыть файл RAW, преобразовать его в QImage или QPixmap, а затем отобразить без сохранения изображения.Я пробовал библиотеки, такие как PIL, rawpy и numpy.Но я слышал, что в сырых файлах обычно есть встроенный JPEG.Есть ли аккуратный способ извлечь это?Из того, что я нашел в интернете, люди конвертируют необработанный файл, а затем сохраняют его в формате JPEG.Но мне нужно показать это без сохранения.

with rawpy.imread(file) as raw:
    rgb = raw.postprocess()
rgb = np.transpose(rgb, (1, 0, 2)).copy()
h, w, a = rgb.shape
qim = QtGui.QImage(rgb, w, h, QtGui.QImage.Format_RGB888)

Это то, что я пытался сейчас.Но это возвращает None.

fd = file(file_path, 'rb')
# Skip over header + directory
# See manufacture specification
offset = 16  # Magic bytes
offset += 12  # Version
offset += 32  # Camera name
offset += 24  # Directory start & meta
fd.seek(offset, 0)
jpeg_offset = unpack('i', fd.read(4))  # Read where JPEG data starts
jpeg_length = unpack('i', fd.read(4))  # Read size of JPEG data
fd.seek(jpeg_offset[0], 0)
jpg_blob = fd.read(jpeg_length[0])
im = QtGui.QImage(jpg_blob)

Это то, что я пытался извлечь из встроенного JPEG.Но это также возвращает None.

Заранее спасибо.

1 Ответ

0 голосов
/ 19 сентября 2019

Используя мой старый ответ , чтобы преобразовать изображение numpy в QImage.

import os
import sys
import rawpy
from PySide import QtCore, QtGui


def read_nef(path):
    image = QtGui.QImage()
    with rawpy.imread(path) as raw:
        src = raw.postprocess()
        h, w, ch = src.shape
        bytesPerLine = ch * w
        buf = src.data.tobytes() # or bytes(src.data)
        image = QtGui.QImage(buf, w, h, bytesPerLine, QtGui.QImage.Format_RGB888)
    return image.copy()


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)

    w = QtGui.QLabel(scaledContents=True)
    w.resize(640, 480)
    w.show()

    current_dir = os.path.dirname(os.path.realpath(__file__))

    # http://www.luminescentphoto.com/nx2/nefs.html
    filepath = os.path.join(current_dir, "baby.nef")
    image = read_nef(filepath)

    w.setPixmap(QtGui.QPixmap.fromImage(image))
    sys.exit(app.exec_())

enter image description here

...