def dngWriter(self): nextbuf = self.wq.get() while nextbuf != None: try: index,target,dng = nextbuf ifd = dng.FULL_IFD if dng.ljpeg: self.tc.put((dng.rawdata,ifd.width,ifd.length)) tile1 = bitunpack.pack16tolj(dng.rawdata,ifd.width,ifd.length/2,16,0,ifd.width/2,ifd.width/2,"") #tile2 = bitunpack.pack16tolj(dng.rawdata,ifd.width,ifd.length/2,16,ifd.width,ifd.width/2,ifd.width/2,"") self.tc.join() # Wait for it to be done tile2 = self.nextCompressedTile ifd._tiles = [ tile1, tile2 ] else: ifd._strips = [ dng.rawdata ] dng.writeFile(target+"_%06d.dng"%index) self.writtenFrame = index except: import traceback traceback.print_exc() self.cancel = True self.wq.task_done() time.sleep(0.016) # Yield nextbuf = self.wq.get() self.wq.task_done()
def tileCompress(self): tilejob = self.tc.get() while tilejob != None: try: rawdata,w,l = tilejob self.nextCompressedTile = bitunpack.pack16tolj(rawdata,w,l/2,16,w,w/2,w/2,"") self.tc.task_done() except: import traceback traceback.print_exc() self.nextCompressedTile = None tilejob = self.tc.get()
def convert(input_file_name_jpeg, input_file_name_raw, width, length): dngTemplate = DNG() rawFrame, tags = process(input_file_name_jpeg, input_file_name_raw, width, length, 16) for k, v in etags.items(): etags[k] = tags[k] tile = bitunpack.pack16tolj(rawFrame, width * 2, length / 2, 10, 0, 0, 0, "", 2) 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, [10])) mainIFD.tags.append(dngTag(Tag.TileWidth, [width])) mainIFD.tags.append(dngTag(Tag.TileLength, [length])) mainIFD.tags.append(dngTag(Tag.Compression, [7])) mainIFD.tags.append(dngTag(Tag.PhotometricInterpretation, [32803])) mainIFD.tags.append(dngTag(Tag.CFARepeatPatternDim, [2, 2])) mainIFD.tags.append(dngTag(Tag.CFAPattern, [2, 1, 1, 0])) mainIFD.tags.append(dngTag(Tag.BlackLevel, [np.amin(rawFrame)])) mainIFD.tags.append(dngTag(Tag.WhiteLevel, [np.amax(rawFrame)])) mainIFD.tags.append(dngTag(Tag.Make, str(etags['Image Make']))) mainIFD.tags.append(dngTag(Tag.Model, str(etags['Image Model']))) mainIFD.tags.append( dngTag(Tag.ApertureValue, parseTag(etags['EXIF ApertureValue']))) mainIFD.tags.append( dngTag(Tag.ShutterSpeedValue, parseTag(etags['EXIF ShutterSpeedValue']))) mainIFD.tags.append( dngTag(Tag.FocalLength, parseTag(etags['EXIF FocalLength']))) mainIFD.tags.append( dngTag(Tag.ExposureTime, parseTag(etags['EXIF ExposureTime']))) mainIFD.tags.append( dngTag(Tag.DateTime, str(etags['EXIF DateTimeDigitized']))) mainIFD.tags.append( dngTag(Tag.PhotographicSensitivity, [int(str(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, "RaspberryPi Camera V2")) mainIFD.tags.append( dngTag(Tag.ColorMatrix1, [[19549, 10000], [-7877, 10000], [-2582, 10000], [-5724, 10000], [10121, 10000], [1917, 10000], [-1267, 10000], [-110, 10000], [6621, 10000]])) mainIFD.tags.append( dngTag(Tag.ColorMatrix2, [[13244, 10000], [-5501, 10000], [-1248, 10000], [-1508, 10000], [9858, 10000], [1935, 10000], [-270, 10000], [-1083, 10000], [4366, 10000]])) mainIFD.tags.append( dngTag(Tag.AsShotNeutral, [[10043, 10000], [16090, 10000], [10000, 10000]])) mainIFD.tags.append(dngTag(Tag.NoiseProfile, [0.000393625, 0.000000122976])) mainIFD.tags.append(dngTag(Tag.CalibrationIlluminant1, [1])) mainIFD.tags.append(dngTag(Tag.CalibrationIlluminant2, [23])) mainIFD.tags.append(dngTag(Tag.PreviewColorSpace, [2])) dngTemplate.IFDs.append(mainIFD) totalLength = dngTemplate.dataLen() # this must happen after dataLen is calculated! (dataLen caches the offsets) mainTagStripOffset.setValue( [k for offset, k in dngTemplate.StripOffsets.items()]) buf = bytearray(totalLength) dngTemplate.setBuffer(buf) dngTemplate.write() outputDNG = input_file_name_jpeg.strip('.JPG') + '.dng' outfile = open(outputDNG, "wb") outfile.write(buf) outfile.close()
def main(): filename = sys.argv[1] r = MlRaw.loadRAWorMLV(filename) d = DNG.DNG() d.stripTotal = 3000000 d.bo = "<" # Little endian # Prepopulate DNG with basic set of tags for a single image ifd = DNG.DNG.IFD(d) d.ifds.append(ifd) d.FULL_IFD = ifd ifd.subFileType = 0 # Full ifd.width = r.width() ifd.length = r.height() e = ifd.entries at(e, DNG.Tag.NewSubfileType, 0) at(e, DNG.Tag.ImageWidth, r.width()) at(e, DNG.Tag.ImageLength, r.height()) at(e, DNG.Tag.BitsPerSample, 14) ifd.BitsPerSample = (14, ) at(e, DNG.Tag.Compression, 1) # No compression at(e, DNG.Tag.PhotometricInterpretation, 32803) # CFA at(e, DNG.Tag.FillOrder, 1) atm(e, DNG.Tag.Make, "Canon") atm(e, DNG.Tag.Model, "EOS") ifd.TileWidth = r.width() / 2 at(e, DNG.Tag.TileWidth, r.width() / 2) at(e, DNG.Tag.TileLength, r.height()) atm(e, DNG.Tag.TileOffsets, (0, 0)) atm(e, DNG.Tag.TileByteCounts, (0, 0)) at(e, DNG.Tag.Orientation, 1) at(e, DNG.Tag.SamplesPerPixel, 1) #at(e,DNG.Tag.RowsPerStrip,r.height()) #ifd.RowsPerStrip = r.height() #at(e,DNG.Tag.StripByteCounts,0) at(e, DNG.Tag.PlanarConfiguration, 1) # Chunky atm(e, DNG.Tag.Software, "MlRawViewer") atm(e, DNG.Tag.CFARepeatPatternDim, (2, 2)) # No compression atm(e, DNG.Tag.CFAPattern, (0, 1, 1, 2)) # No compression at(e, DNG.Tag.Compression, 7) # No compression atm(e, DNG.Tag.DNGVersion, (1, 4, 0, 0)) atm(e, DNG.Tag.UniqueCameraModel, "Canon EOS") at(e, DNG.Tag.BlackLevel, r.black) at(e, DNG.Tag.WhiteLevel, r.white) atm(e, DNG.Tag.DefaultCropOrigin, (0, 0)) atm(e, DNG.Tag.DefaultCropSize, (r.width(), r.height())) m = [(int(v * 10000), 10000) for v in r.colorMatrix.A1] atm(e, DNG.Tag.ColorMatrix1, m) atm(e, DNG.Tag.AsShotNeutral, ((473635, 1000000), (1000000, 1000000), (624000, 1000000))) at(e, DNG.Tag.FrameRate, (25000, 1000)) import zlib, array minlevel = 2048 delin = array.array('H', [0 for i in range(2**14)]) for i in range(minlevel, 2048 + minlevel): delin[i] = i - minlevel for i in range(2048 + minlevel, 4096 + minlevel): delin[i] = 2048 + ((i - minlevel - 2048) >> 1) for i in range(4096 + minlevel, 8192 + minlevel): delin[i] = 3072 + ((i - minlevel - 4096) >> 3) for i in range(8192 + minlevel, 16384): delin[i] = 3584 + ((i - minlevel - 8192) >> 4) delin = delin.tostring() lin = array.array('H', [0 for i in range(2**12)]) for i in range(2048): lin[i] = i + minlevel for i in range(2048, 3072): lin[i] = ((i - 2048) << 1) + minlevel + 2048 for i in range(3072, 3584): lin[i] = ((i - 3072) << 3) + minlevel + 4096 for i in range(3584, 4096): lin[i] = ((i - 3584) << 4) + minlevel + 8192 lin = lin.tostring() for i in range(1, r.frames()): r.preloadFrame(i) f = r.frame(i) f.convert() #compressed = bitunpack.pack16tolj(f.rawimage,f.width*2,f.height/2,14,0,f.width,0,"") #tile1l = bitunpack.pack16tolj(f.rawimage,f.width,f.height/2,16,0,f.width/2,f.width/2,delin) #tile2l = bitunpack.pack16tolj(f.rawimage,f.width,f.height/2,16,f.width,f.width/2,f.width/2,delin) tile2 = bitunpack.pack16tolj(f.rawimage, f.width, f.height / 2, 16, f.width, f.width / 2, f.width / 2, "") tile1 = bitunpack.pack16tolj(f.rawimage, f.width, f.height / 2, 16, 0, f.width / 2, f.width / 2, "") print len(tile1), len(tile2), len(tile1) + len(tile2) #print len(tile1l),len(tile2l),len(tile1l)+len(tile2l) #image = array.array('H',"\0\0"*(f.width*f.height)) #bitunpack.unpackljto16(buffer(compressed),image,0,f.width,0,"") #bitunpack.unpackljto16(str(tile1),image,0,f.width/2,f.width/2,"") #bitunpack.unpackljto16(str(tile2),image,f.width,f.width/2,f.width/2,"") """ il = 256 one = f.rawimage.tostring() two = image.tostring() if one != two: print "different!" orig = len(f.rawdata) comp = len(tile1)+len(tile2) compl = len(tile1l)+len(tile2l) print orig,comp,compl,float(comp)/float(orig),float(compl)/float(orig) """ """ fi = file("%d.raw"%i,'wb') fi.write(f.rawimage) fi.close() break """ ifd._tiles = [tile1, tile2] d.writeFile(sys.argv[2] + "_%05d.dng" % i)