我的
swift代码中有一个过滤器有问题:luminosityModifier,红色,绿色,蓝色和alpha工作的其他过滤器.如果我使用0作为luminosityModifier值,代码运行没有错误,但如果我尝试任何其他整数,我看到错误:
执行被中断,原因是:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0).这是此代码的最后一行.
执行被中断,原因是:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0).这是此代码的最后一行.
import UIKit let image = UIImage(named: "sample.png")! // Process the image! // The Filter class contains the deFinition of a simple RGBA variable class Filter{ var rgba = [UInt8](count:5,repeatedValue: 0) } // Here are the 5 filters that can later be selected. By modifying the RGBA values,I intened to serve the requirement to create modifiers to individual filters. let redFilter: Filter = Filter() redFilter.rgba[0] = 255 let greenFilter: Filter = Filter() greenFilter.rgba[1] = 45 let blueFilter: Filter = Filter() blueFilter.rgba[2] = 255 let alphaFilter: Filter = Filter() alphaFilter.rgba[3] = 50 // Set luminosity Modifier in desired percentage (%),should be <100 to avoid explosion due to internal rounding let luminosityModifier = Filter() luminosityModifier.rgba[4] = 20 class ImageProcessor{ var filterSequenceList: [String] = [] //This Dictionary is later used to accept strings to set the filter the processor will apply. var filtersAvailable: [String: Filter] = [ "redFilter": redFilter,"greenFilter": greenFilter,"blueFilter": blueFilter,"alphaFilter": alphaFilter,"luminosityModifier": luminosityModifier ] func addFilterToSequence(filterName: String){ filterSequenceList.append(filterName) } func applyFilters(image: UIImage) -> UIImage{ var filters: [Filter] = [] // A list if filters gets populated according to the array of strings entered. for name in filterSequenceList{ filters.append(filtersAvailable[name]!) } let rgbaimage = RGBaimage(image: image)! // Loop through each pixel for y in 0..<rgbaimage.height{ for x in 0..<rgbaimage.width{ let index = y * rgbaimage.width + x var pixel = rgbaimage.pixels[index] // Loop through each filter for filter in filters{ for value in 0...4 { // RGBA values with value 0 get ignored. This means that 1 needs to be used if you wand that specific value to be very low. if(filter.rgba[value] != 0 ){ switch value{ case 0: pixel.red = filter.rgba[value] rgbaimage.pixels[index] = pixel case 1: pixel.green = filter.rgba[value] rgbaimage.pixels[index] = pixel case 2: pixel.blue = filter.rgba[value] rgbaimage.pixels[index] = pixel case 3: pixel.alpha = filter.rgba[value] rgbaimage.pixels[index] = pixel case 4: let red = pixel.red let green = pixel.green let blue = pixel.blue let luminosityModifier = Double(filter.rgba[value]) let relativeluminosity = Double(red) * 0.2126 + Double(green) * 0.7152 + Double(blue) * 0.0722 let transformerRed = (relativeluminosity - Double(green) * 0.7152 - Double(blue) * 0.0722) / 0.2126 let transformerGreen = (relativeluminosity - Double(red) * 0.2126 - Double(blue) * 0.0722 ) / 0.7152 let transformerBlue = (relativeluminosity - Double(red) * 0.2126 - Double(green) * 0.7152 ) / 0.0722 pixel.red = UInt8(transformerRed * luminosityModifier / 100 ) pixel.green = UInt8(transformerGreen * luminosityModifier / 100) pixel.blue = UInt8(transformerBlue * luminosityModifier / 100) rgbaimage.pixels[index] = pixel default: print("No image changes") } } } } } } let newImage = rgbaimage.toUIImage()! return newImage } } //--------------------------------------- Start using the class here-------------------------------- var processor: ImageProcessor = ImageProcessor() // Use the addFilterToSequence function and pass in one of the strings mentioned below. Using a non-existing filter name will cause a runtime error // "redFilter" // "greenFilter" // "blueFilter" // "alphaFilter" // "luminosityModifier" //processor.addFilterToSequence("redFilter") //processor.addFilterToSequence("blueFilter") processor.addFilterToSequence("luminosityModifier") //processor.addFilterToSequence("greenFilter") //processor.addFilterToSequence("alphaFilter") processor.filterSequenceList processor.applyFilters(image)
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。