Example #1
0
    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))
Example #2
0
    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])
Example #3
0
	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) )
Example #4
0
	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) )
Example #5
0
    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)