def convert(self, image, tags, filename="image", path="", process=None, compress=False): dngTemplate = DNG() rawFrame = self.__process__(image, process) file_output = True width = tags.get(Tag.ImageWidth)[0] length = tags.get(Tag.ImageLength)[0] bpp = tags.get(Tag.BitsPerSample)[0] compression_scheme = 7 if compress else 1 if compress: from ljpegCompress import pack16tolj tile = pack16tolj(rawFrame, int(width * 2), int(length / 2), bpp, 0, 0, 0, "", 6) else: if bpp == 8: tile = rawFrame.astype('uint8').tobytes() elif bpp == 10: tile = pack10(rawFrame).tobytes() elif bpp == 12: tile = pack12(rawFrame).tobytes() elif bpp == 14: tile = pack14(rawFrame).tobytes() elif bpp == 16: tile = rawFrame.tobytes() dngTemplate.ImageDataStrips.append(tile) # set up the FULL IFD mainIFD = dngIFD() mainTagStripOffset = dngTag( Tag.TileOffsets, [0 for tile in dngTemplate.ImageDataStrips]) mainIFD.tags.append(mainTagStripOffset) mainIFD.tags.append(dngTag(Tag.NewSubfileType, [0])) mainIFD.tags.append( dngTag(Tag.TileByteCounts, [len(tile) for tile in dngTemplate.ImageDataStrips])) mainIFD.tags.append(dngTag(Tag.Compression, [compression_scheme])) mainIFD.tags.append(dngTag(Tag.Software, "PyDNG")) for tag in tags.list(): try: mainIFD.tags.append(dngTag(tag[0], tag[1])) except Exception as e: print("TAG Encoding Error!", e, tag) dngTemplate.IFDs.append(mainIFD) totalLength = dngTemplate.dataLen() mainTagStripOffset.setValue( [k for offset, k in dngTemplate.StripOffsets.items()]) buf = bytearray(totalLength) dngTemplate.setBuffer(buf) dngTemplate.write() if file_output: outputDNG = filename + '.dng' outfile = open(path + outputDNG, "wb") outfile.write(buf) outfile.close() return outputDNG else: return buf
def convert(self, image, width=None, length=None, process=None, compress=False, bpp=None): dngTemplate = DNG() file_output = False if isinstance(image, str): file_output = True elif isinstance(image, io.BytesIO): file_output = False else: raise ValueError rawFrame = self.__process__(image, process) for k, v in self.etags.items(): try: self.etags[k] = self.__exif__[k] except KeyError: self.etags[k] = 0 if not width: width = int(self.header.width) if not length: length = int(self.header.height) cfa_pattern = BAYER_ORDER[self.header.bayer_order] camera_version = CAMERA_VERSION[str(self.etags['Image Model'])] sensor_bpp = SENSOR_NATIVE_BPP[str(self.etags['Image Model'])] if not bpp: bpp = sensor_bpp sensor_black = 1984 >> (16 - bpp) sensor_white = (1 << bpp) - 1 profile_name = "Standard Profile" profile_embed = 3 fm = False rphq_str = ('RP_testc', 'imx477', 'RP_imx477') if str(self.etags['Image Model']) in rphq_str: profile_name = "Repro 2_5D no LUT - D65 is really 5960K" ccm1 = [[6759, 10000], [-2379, 10000], [751, 10000], [-4432, 10000], [13871, 10000], [5465, 10000], [-401, 10000], [1664, 10000], [7845, 10000]] ccm2 = [[5603, 10000], [-1351, 10000], [-600, 10000], [-2872, 10000], [11180, 10000], [2132, 10000], [600, 10000], [453, 10000], [5821, 10000]] fm = True fm1 = [[7889, 10000], [1273, 10000], [482, 10000], [2401, 10000], [9705, 10000], [-2106, 10000], [-26, 10000], [-4406, 10000], [12683, 10000]] fm2 = [[6591, 10000], [3034, 10000], [18, 10000], [1991, 10000], [10585, 10000], [-2575, 10000], [-493, 10000], [-919, 10000], [9663, 10000]] ci1 = 17 ci2 = 21 else: as_shot_neutral = [[10043, 10000], [16090, 10000], [10000, 10000]] ccm1 = [[19549, 10000], [-7877, 10000], [-2582, 10000], [-5724, 10000], [10121, 10000], [1917, 10000], [-1267, 10000], [-110, 10000], [6621, 10000]] ccm2 = [[13244, 10000], [-5501, 10000], [-1248, 10000], [-1508, 10000], [9858, 10000], [1935, 10000], [-270, 10000], [-1083, 10000], [4366, 10000]] ci1 = 1 ci2 = 23 baseline_exp = 1 camera_calibration = [[1, 1], [0, 1], [0, 1], [0, 1], [1, 1], [0, 1], [0, 1], [0, 1], [1, 1]] if self.maker_note: gain_r = int(float(self.maker_note['gain_r']) * 1000) gain_b = int(float(self.maker_note['gain_b']) * 1000) baseline_exp = int(self.maker_note['ev']) as_shot_neutral = [[1000, gain_r], [1000, 1000], [1000, gain_b]] compression_scheme = 7 if compress else 1 if compress: from ljpegCompress import pack16tolj tile = pack16tolj(rawFrame, int(width * 2), int(length / 2), bpp, 0, 0, 0, "", 6) else: if (bpp - sensor_bpp) >= 0: rawFrame = rawFrame << (bpp - sensor_bpp) else: rawFrame = rawFrame >> abs(bpp - sensor_bpp) if bpp == 8: tile = (rawFrame // 255).astype('uint8').tobytes() elif bpp == 10: tile = pack10(rawFrame).tobytes() elif bpp == 12: tile = pack12(rawFrame).tobytes() elif bpp == 14: tile = pack14(rawFrame).tobytes() elif bpp == 16: tile = rawFrame.tobytes() dngTemplate.ImageDataStrips.append(tile) # set up the FULL IFD mainIFD = dngIFD() mainTagStripOffset = dngTag( Tag.TileOffsets, [0 for tile in dngTemplate.ImageDataStrips]) mainIFD.tags.append(mainTagStripOffset) mainIFD.tags.append(dngTag(Tag.NewSubfileType, [0])) mainIFD.tags.append( dngTag(Tag.TileByteCounts, [len(tile) for tile in dngTemplate.ImageDataStrips])) mainIFD.tags.append(dngTag(Tag.ImageWidth, [width])) mainIFD.tags.append(dngTag(Tag.ImageLength, [length])) mainIFD.tags.append(dngTag(Tag.SamplesPerPixel, [1])) mainIFD.tags.append(dngTag(Tag.BitsPerSample, [bpp])) mainIFD.tags.append(dngTag(Tag.TileWidth, [width])) mainIFD.tags.append(dngTag(Tag.TileLength, [length])) mainIFD.tags.append(dngTag(Tag.Compression, [compression_scheme])) mainIFD.tags.append(dngTag(Tag.PhotometricInterpretation, [32803])) mainIFD.tags.append(dngTag(Tag.CFARepeatPatternDim, [2, 2])) mainIFD.tags.append(dngTag(Tag.CFAPattern, cfa_pattern)) mainIFD.tags.append(dngTag(Tag.BlackLevel, [sensor_black])) mainIFD.tags.append(dngTag(Tag.WhiteLevel, [sensor_white])) mainIFD.tags.append(dngTag(Tag.Make, str(self.etags['Image Make']))) mainIFD.tags.append(dngTag(Tag.Model, str(self.etags['Image Model']))) mainIFD.tags.append( dngTag(Tag.ApertureValue, parseTag(self.etags['EXIF ApertureValue']))) mainIFD.tags.append( dngTag(Tag.ShutterSpeedValue, parseTag(self.etags['EXIF ShutterSpeedValue']))) mainIFD.tags.append( dngTag(Tag.FocalLength, parseTag(self.etags['EXIF FocalLength']))) mainIFD.tags.append( dngTag(Tag.ExposureTime, parseTag(self.etags['EXIF ExposureTime']))) mainIFD.tags.append( dngTag(Tag.DateTime, str(self.etags['EXIF DateTimeDigitized']))) mainIFD.tags.append( dngTag(Tag.PhotographicSensitivity, [int(str(self.etags['EXIF ISOSpeedRatings']))])) mainIFD.tags.append(dngTag(Tag.Software, "PyDNG")) mainIFD.tags.append(dngTag(Tag.Orientation, [1])) mainIFD.tags.append(dngTag(Tag.DNGVersion, [1, 4, 0, 0])) mainIFD.tags.append(dngTag(Tag.DNGBackwardVersion, [1, 2, 0, 0])) mainIFD.tags.append(dngTag(Tag.UniqueCameraModel, camera_version)) mainIFD.tags.append(dngTag(Tag.ColorMatrix1, ccm1)) mainIFD.tags.append(dngTag(Tag.ColorMatrix2, ccm2)) if fm: mainIFD.tags.append(dngTag(Tag.ForwardMatrix1, fm1)) mainIFD.tags.append(dngTag(Tag.ForwardMatrix2, fm2)) mainIFD.tags.append(dngTag(Tag.CameraCalibration1, camera_calibration)) mainIFD.tags.append(dngTag(Tag.CameraCalibration2, camera_calibration)) mainIFD.tags.append(dngTag(Tag.AsShotNeutral, as_shot_neutral)) mainIFD.tags.append(dngTag(Tag.BaselineExposure, [[baseline_exp, 1]])) mainIFD.tags.append(dngTag(Tag.CalibrationIlluminant1, [ci1])) mainIFD.tags.append(dngTag(Tag.CalibrationIlluminant2, [ci2])) mainIFD.tags.append(dngTag(Tag.ProfileName, profile_name)) mainIFD.tags.append(dngTag(Tag.ProfileEmbedPolicy, [profile_embed])) # mainIFD.tags.append(dngTag(Tag.ProfileToneCurve , [0.0,0.0,1.0,1.0])) mainIFD.tags.append(dngTag(Tag.DefaultBlackRender, [0])) mainIFD.tags.append(dngTag(Tag.PreviewColorSpace, [2])) dngTemplate.IFDs.append(mainIFD) totalLength = dngTemplate.dataLen() mainTagStripOffset.setValue( [k for offset, k in dngTemplate.StripOffsets.items()]) buf = bytearray(totalLength) dngTemplate.setBuffer(buf) dngTemplate.write() if file_output: outputDNG = image[:-4] + '.dng' outfile = open(outputDNG, "wb") outfile.write(buf) outfile.close() return outputDNG else: return buf