def test(self): i = GafferImage.ImageReader() i["fileName"].setValue(self.checkerFile) inMetadata = i["out"]["metadata"].getValue() m = GafferImage.DeleteImageMetadata() m["in"].setInput(i["out"]) # check that the image is passed through metadata = m["out"]["metadata"].getValue() self.assertEqual(m["out"]["metadata"].getValue(), inMetadata) self.assertEqual(m["out"].image(), i["out"].image()) self.assertTrue("screenWindowWidth" in metadata) self.assertTrue("screenWindowCenter" in metadata) self.assertTrue("compression" in metadata) # check that we can delete metadata m["names"].setValue("screen* compression") metadata = m["out"]["metadata"].getValue() self.assertFalse("screenWindowWidth" in metadata) self.assertFalse("screenWindowCenter" in metadata) self.assertFalse("compression" in metadata) for key in metadata.keys(): self.assertEqual(metadata[key], inMetadata[key]) # check that we can invert the deletion m["invertNames"].setValue(True) metadata = m["out"]["metadata"].getValue() expected = set( ["screenWindowWidth", "screenWindowCenter", "compression"]) self.assertEqual(set(metadata.keys()), expected) for key in metadata.keys(): self.assertEqual(metadata[key], inMetadata[key]) # test dirty propagation cs = GafferTest.CapturingSlot(m.plugDirtiedSignal()) m["names"].setValue("") self.assertTrue(m["out"]["metadata"] in set(e[0] for e in cs)) del cs[:] m["invertNames"].setValue(False) self.assertTrue(m["out"]["metadata"] in set(e[0] for e in cs))
def test(self): r = GafferImage.ImageReader() r["fileName"].setValue(self.checkerFile) inMetadata = r["out"]["metadata"].getValue() d = GafferImage.DeleteImageMetadata() d["in"].setInput(r["out"]) d["names"].setValue("*") m = GafferImage.CopyImageMetadata() m["in"].setInput(d["out"]) m["copyFrom"].setInput(r["out"]) m["names"].setValue("") # check that the image is passed through metadata = m["out"]["metadata"].getValue() self.assertEqual(m["out"]["metadata"].getValue(), IECore.CompoundData()) self.assertEqual(m["out"].image(), d["out"].image()) # check that we can copy specific metadata m["names"].setValue("screen* compression") metadata = m["out"]["metadata"].getValue() expected = set( ["screenWindowWidth", "screenWindowCenter", "compression"]) self.assertEqual(set(metadata.keys()), expected) for key in metadata.keys(): self.assertEqual(metadata[key], inMetadata[key]) # check that we can invert the selection m["invertNames"].setValue(True) metadata = m["out"]["metadata"].getValue() expected = set(inMetadata.keys()) - set( ["screenWindowWidth", "screenWindowCenter", "compression"]) self.assertEqual(set(metadata.keys()), expected) for key in metadata.keys(): self.assertEqual(metadata[key], inMetadata[key])
def __testMetadataDoesNotAffectPixels( self, ext, overrideMetadata = {}, metadataToIgnore = [] ) : r = GafferImage.ImageReader() r["fileName"].setValue( self.__rgbFilePath+"."+ext ) d = GafferImage.DeleteImageMetadata() d["in"].setInput( r["out"] ) m = GafferImage.ImageMetadata() m["in"].setInput( d["out"] ) # lets tell a few lies # IPTC:Creator will have the current username appended to the end of # the existing one, creating a list of creators. Blank it out for # this test d["names"].setValue( "IPTC:Creator" ) m["metadata"].addMember( "PixelAspectRatio", IECore.FloatData( 2 ) ) m["metadata"].addMember( "oiio:ColorSpace", IECore.StringData( "Rec709" ) ) m["metadata"].addMember( "oiio:BitsPerSample", IECore.IntData( 8 ) ) m["metadata"].addMember( "oiio:UnassociatedAlpha", IECore.IntData( 1 ) ) m["metadata"].addMember( "oiio:Gamma", IECore.FloatData( 0.25 ) ) testFile = self.__testFile( "metadataHasNoAffect", "RGBA", ext ) self.failIf( os.path.exists( testFile ) ) w = GafferImage.ImageWriter() w["in"].setInput( m["out"] ) w["fileName"].setValue( testFile ) w["channels"].setValue( IECore.StringVectorData( m["out"]["channelNames"].getValue() ) ) testFile2 = self.__testFile( "noNewMetadata", "RGBA", ext ) self.failIf( os.path.exists( testFile2 ) ) w2 = GafferImage.ImageWriter() w2["in"].setInput( d["out"] ) w2["fileName"].setValue( testFile2 ) w2["channels"].setValue( IECore.StringVectorData( r["out"]["channelNames"].getValue() ) ) inMetadata = w["in"]["metadata"].getValue() self.assertEqual( inMetadata["PixelAspectRatio"], IECore.FloatData( 2 ) ) self.assertEqual( inMetadata["oiio:ColorSpace"], IECore.StringData( "Rec709" ) ) self.assertEqual( inMetadata["oiio:BitsPerSample"], IECore.IntData( 8 ) ) self.assertEqual( inMetadata["oiio:UnassociatedAlpha"], IECore.IntData( 1 ) ) self.assertEqual( inMetadata["oiio:Gamma"], IECore.FloatData( 0.25 ) ) with Gaffer.Context() : w["task"].execute() w2["task"].execute() self.failUnless( os.path.exists( testFile ) ) self.failUnless( os.path.exists( testFile2 ) ) after = GafferImage.ImageReader() after["fileName"].setValue( testFile ) before = GafferImage.ImageReader() before["fileName"].setValue( testFile2 ) inImage = w["in"].image() afterImage = after["out"].image() beforeImage = before["out"].image() inImage.blindData().clear() afterImage.blindData().clear() beforeImage.blindData().clear() self.assertEqual( afterImage, inImage ) self.assertEqual( afterImage, beforeImage ) self.assertEqual( after["out"]["format"].getValue(), r["out"]["format"].getValue() ) self.assertEqual( after["out"]["format"].getValue(), before["out"]["format"].getValue() ) self.assertEqual( after["out"]["dataWindow"].getValue(), r["out"]["dataWindow"].getValue() ) self.assertEqual( after["out"]["dataWindow"].getValue(), before["out"]["dataWindow"].getValue() ) afterMetadata = after["out"]["metadata"].getValue() beforeMetadata = before["out"]["metadata"].getValue() expectedMetadata = r["out"]["metadata"].getValue() # they were written at different times so we can't expect those values to match beforeMetadata["DateTime"] = afterMetadata["DateTime"] expectedMetadata["DateTime"] = afterMetadata["DateTime"] # the writer adds several standard attributes that aren't in the original file expectedMetadata["Software"] = IECore.StringData( "Gaffer " + Gaffer.About.versionString() ) expectedMetadata["HostComputer"] = IECore.StringData( platform.node() ) expectedMetadata["Artist"] = IECore.StringData( os.environ["USER"] ) expectedMetadata["DocumentName"] = IECore.StringData( "untitled" ) self.__addExpectedIPTCMetadata( afterMetadata, expectedMetadata ) for key in overrideMetadata : expectedMetadata[key] = overrideMetadata[key] beforeMetadata[key] = overrideMetadata[key] for key in metadataToIgnore : if key in expectedMetadata : del expectedMetadata[key] if key in beforeMetadata : del beforeMetadata[key] if key in afterMetadata : del afterMetadata[key] for metaName in expectedMetadata.keys() : self.assertTrue( metaName in afterMetadata.keys(), "Writer Metadata missing expected key \"{}\" set to \"{}\" : {}".format(metaName, str(expectedMetadata[metaName]), ext) ) self.assertEqual( expectedMetadata[metaName], afterMetadata[metaName], "Metadata does not match for key \"{}\" : {}".format(metaName, ext) ) for metaName in beforeMetadata.keys() : self.assertTrue( metaName in afterMetadata.keys(), "Writer Metadata missing expected key \"{}\" set to \"{}\" : {}".format(metaName, str(beforeMetadata[metaName]), ext) ) self.assertEqual( beforeMetadata[metaName], afterMetadata[metaName], "Metadata does not match for key \"{}\" : {}".format(metaName, ext) )
def __testMetadataDoesNotAffectPixels( self, ext, overrideMetadata = {}, metadataToIgnore = [] ) : reader = GafferImage.ImageReader() reader["fileName"].setValue( self.__rgbFilePath+"."+ext ) # IPTC:Creator will have the current username appended to the end of # the existing one, creating a list of creators. Blank out the initial # value for this test. regularMetadata = GafferImage.DeleteImageMetadata() regularMetadata["in"].setInput( reader["out"] ) regularMetadata["names"].setValue( "IPTC:Creator" ) # Add misleading metadata that if taken at face value could cause # us to write the wrong information to the file. Our governing rule # is that metadata is just "along for the ride", and should never # have any effect on the content of images themselves. misleadingMetadata = GafferImage.ImageMetadata() misleadingMetadata["in"].setInput( regularMetadata["out"] ) misleadingMetadata["metadata"].addMember( "PixelAspectRatio", IECore.FloatData( 2 ) ) misleadingMetadata["metadata"].addMember( "oiio:ColorSpace", IECore.StringData( "Rec709" ) ) misleadingMetadata["metadata"].addMember( "oiio:BitsPerSample", IECore.IntData( 8 ) ) misleadingMetadata["metadata"].addMember( "oiio:UnassociatedAlpha", IECore.IntData( 1 ) ) misleadingMetadata["metadata"].addMember( "oiio:Gamma", IECore.FloatData( 0.25 ) ) # Create ImageWriters to write out the images with regular # and misleading metadata. regularWriter = GafferImage.ImageWriter() regularWriter["in"].setInput( regularMetadata["out"] ) regularWriter["fileName"].setValue( self.__testFile( "regularMetadata", "RGBA", ext ) ) self.failIf( os.path.exists( regularWriter["fileName"].getValue() ) ) misledWriter = GafferImage.ImageWriter() misledWriter["in"].setInput( misleadingMetadata["out"] ) misledWriter["fileName"].setValue( self.__testFile( "misleadingMetadata", "RGBA", ext ) ) self.failIf( os.path.exists( misledWriter["fileName"].getValue() ) ) # Check that the writer is indeed being given misleading metadata. m = misledWriter["in"]["metadata"].getValue() self.assertEqual( m["PixelAspectRatio"], IECore.FloatData( 2 ) ) self.assertEqual( m["oiio:ColorSpace"], IECore.StringData( "Rec709" ) ) self.assertEqual( m["oiio:BitsPerSample"], IECore.IntData( 8 ) ) self.assertEqual( m["oiio:UnassociatedAlpha"], IECore.IntData( 1 ) ) self.assertEqual( m["oiio:Gamma"], IECore.FloatData( 0.25 ) ) # Execute the writers regularWriter["task"].execute() misledWriter["task"].execute() self.failUnless( os.path.exists( regularWriter["fileName"].getValue() ) ) self.failUnless( os.path.exists( misledWriter["fileName"].getValue() ) ) # Make readers to read back what we wrote out misledReader = GafferImage.ImageReader() misledReader["fileName"].setInput( misledWriter["fileName"] ) regularReader = GafferImage.ImageReader() regularReader["fileName"].setInput( regularWriter["fileName"] ) # Check that the pixel data, format and data window has not # been changed at all, regardless of which metadata # was provided to the writers. self.assertImagesEqual( misledWriter["in"], misledReader["out"], ignoreMetadata = True ) self.assertImagesEqual( misledReader["out"], regularReader["out"], ignoreMetadata = True ) # Load the metadata from the files, and figure out what # metadata we expect to have based on what we expect the # writer to add, and what the reader adds automatically # during loading. misledReaderMetadata = misledReader["out"]["metadata"].getValue() regularReaderMetadata = regularReader["out"]["metadata"].getValue() expectedMetadata = regularMetadata["out"]["metadata"].getValue() expectedMetadata["DateTime"] = regularReaderMetadata["DateTime"] expectedMetadata["Software"] = IECore.StringData( "Gaffer " + Gaffer.About.versionString() ) expectedMetadata["HostComputer"] = IECore.StringData( platform.node() ) expectedMetadata["Artist"] = IECore.StringData( os.environ["USER"] ) expectedMetadata["DocumentName"] = IECore.StringData( "untitled" ) expectedMetadata["fileFormat"] = regularReaderMetadata["fileFormat"] expectedMetadata["dataType"] = regularReaderMetadata["dataType"] self.__addExpectedIPTCMetadata( regularReaderMetadata, expectedMetadata ) for key, value in overrideMetadata.items() : expectedMetadata[key] = value regularReaderMetadata[key] = value # Now check that we have what we expect. for metaName in expectedMetadata.keys() : if metaName in metadataToIgnore : continue self.assertTrue( metaName in misledReaderMetadata.keys(), "Writer Metadata missing expected key \"{}\" set to \"{}\" : {}".format(metaName, str(expectedMetadata[metaName]), ext) ) self.assertEqual( expectedMetadata[metaName], misledReaderMetadata[metaName], "Metadata does not match for key \"{}\" : {}".format(metaName, ext) ) for metaName in regularReaderMetadata.keys() : if metaName in metadataToIgnore : continue self.assertTrue( metaName in misledReaderMetadata.keys(), "Writer Metadata missing expected key \"{}\" set to \"{}\" : {}".format(metaName, str(expectedMetadata[metaName]), ext) ) self.assertEqual( regularReaderMetadata[metaName], misledReaderMetadata[metaName], "Metadata does not match for key \"{}\" : {}".format(metaName, ext) )
def __testMetadataDoesNotAffectPixels(self, ext): r = GafferImage.ImageReader() r["fileName"].setValue(self.__rgbFilePath + "." + ext) d = GafferImage.DeleteImageMetadata() d["in"].setInput(r["out"]) m = GafferImage.ImageMetadata() m["in"].setInput(d["out"]) # lets tell a few lies # IPTC:Creator will have the current username appended to the end of # the existing one, creating a list of creators. Blank it out for # this test d["names"].setValue("IPTC:Creator") m["metadata"].addMember("PixelAspectRatio", IECore.FloatData(2)) m["metadata"].addMember("oiio:ColorSpace", IECore.StringData("Rec709")) m["metadata"].addMember("oiio:BitsPerSample", IECore.IntData(8)) m["metadata"].addMember("oiio:UnassociatedAlpha", IECore.IntData(1)) m["metadata"].addMember("oiio:Gamma", IECore.FloatData(0.25)) testFile = self.__testFile("metadataHasNoAffect", "RGBA", ext) self.failIf(os.path.exists(testFile)) w = GafferImage.ImageWriter() w["in"].setInput(m["out"]) w["fileName"].setValue(testFile) w["channels"].setValue( IECore.StringVectorData(m["out"]["channelNames"].getValue())) testFile2 = self.__testFile("noNewMetadata", "RGBA", ext) self.failIf(os.path.exists(testFile2)) w2 = GafferImage.ImageWriter() w2["in"].setInput(d["out"]) w2["fileName"].setValue(testFile2) w2["channels"].setValue( IECore.StringVectorData(r["out"]["channelNames"].getValue())) inMetadata = w["in"]["metadata"].getValue() self.assertEqual(inMetadata["PixelAspectRatio"], IECore.FloatData(2)) self.assertEqual(inMetadata["oiio:ColorSpace"], IECore.StringData("Rec709")) self.assertEqual(inMetadata["oiio:BitsPerSample"], IECore.IntData(8)) self.assertEqual(inMetadata["oiio:UnassociatedAlpha"], IECore.IntData(1)) self.assertEqual(inMetadata["oiio:Gamma"], IECore.FloatData(0.25)) with Gaffer.Context(): w.execute() w2.execute() self.failUnless(os.path.exists(testFile)) self.failUnless(os.path.exists(testFile2)) after = GafferImage.ImageReader() after["fileName"].setValue(testFile) before = GafferImage.ImageReader() before["fileName"].setValue(testFile2) inImage = w["in"].image() afterImage = after["out"].image() beforeImage = before["out"].image() inImage.blindData().clear() afterImage.blindData().clear() beforeImage.blindData().clear() self.assertEqual(afterImage, inImage) self.assertEqual(afterImage, beforeImage) self.assertEqual(after["out"]["format"].getValue(), r["out"]["format"].getValue()) self.assertEqual(after["out"]["format"].getValue(), before["out"]["format"].getValue()) self.assertEqual(after["out"]["dataWindow"].getValue(), r["out"]["dataWindow"].getValue()) self.assertEqual(after["out"]["dataWindow"].getValue(), before["out"]["dataWindow"].getValue()) afterMetadata = after["out"]["metadata"].getValue() beforeMetadata = before["out"]["metadata"].getValue() expectedMetadata = r["out"]["metadata"].getValue() # they were written at different times so we can't expect those values to match beforeMetadata["DateTime"] = afterMetadata["DateTime"] expectedMetadata["DateTime"] = afterMetadata["DateTime"] # the writer adds several standard attributes that aren't in the original file expectedMetadata["Software"] = IECore.StringData( "Gaffer " + Gaffer.About.versionString()) expectedMetadata["HostComputer"] = IECore.StringData(platform.node()) expectedMetadata["Artist"] = IECore.StringData(os.getlogin()) expectedMetadata["DocumentName"] = IECore.StringData("untitled") # some formats support IPTC standards, and some of the standard metadata # is translated automatically by OpenImageIO. for key in afterMetadata.keys(): if key.startswith("IPTC:"): expectedMetadata["IPTC:OriginatingProgram"] = expectedMetadata[ "Software"] expectedMetadata["IPTC:Creator"] = expectedMetadata["Artist"] break self.assertEqual(afterMetadata, expectedMetadata) self.assertEqual(afterMetadata, beforeMetadata)