web-dev-qa-db-ja.com

NSDataからUIImage

UIIMageを保存してから取得して表示しようとしています。バンドルに画像を保存し、そこから取得して表示することで成功しました。私の問題は、イメージをディスクに保存(NSDataに変換)してから取得しようとしたときに発生します。私はそのように画像をNSDataに変換します...

NSData* topImageData = UIImageJPEGRepresentation(topImage, 1.0);

それから私はそれをディスクに書き込む...

[topImageData writeToFile:topPathToFile atomically:NO];

それから私はそのようにそれを取得しようとしました...

topSubView.image = [[UIImage alloc] initWithContentsOfFile:topPathToFile];

これは画像を返しません(サイズはゼロです)。それで私は試しました...

NSData *data = [[NSData alloc] initWithContentsOfFile:topPathToFile];
topSubView.image = [[UIImage alloc] initWithData:data];

無駄に。デバッガーをステップ実行すると、データに正しいバイト数が含まれていることがわかりますが、イメージが作成されない理由がわかりません。足りない?画像に変換する前にNSDataで何かする必要がありますか?

20
bruin

このコードを試してください。これでうまくいきました

データを保存しています。

画像を保存するパスを作成します。

let libraryDirectory = NSSearchPathForDirectoriesInDomains(.libraryDirectory,
                                                               .userDomainMask,
                                                               true)[0]
let libraryURL = URL(fileURLWithPath: libraryDirectory, isDirectory: true)
let fileURL = libraryURL.appendingPathComponent("image.data")

画像をDataオブジェクトに変換し、ファイルに保存します。

let data = UIImageJPEGRepresentation(myImage, 1.0)
try? data?.write(to: fileURL)

保存された画像を取得する

let newImage = UIImage(contentsOfFile: fileURL.relativePath)

Imageviewを作成し、取得した画像とともに読み込みます。

let imageView = UIImageView(image: newImage)
self.view.addSubview(imageView)
33
ArunGJ

UIImageのクラスメソッドを使用できるはずです。

[UIImage imageWithContentsOfFile:topPathToFile]; 

OR

[UIImage imageWithData:data];

うまくいきませんでしたか?

お役に立てれば!

17
Kartik Shah

これが誰かを助けるために、iOS6からimageWithData:scaleメソッドがあります。 NSDataオブジェクトから正しい縮尺のUIImageを取得するには、そのメソッドを使用して、元の画像の保存に使用する縮尺を宣言します。例えば:

CGFloat screenScale = [[UIScreen mainScreen] scale];
UIImage *image = [UIImage imageWithData:myimage scale:screenScale];

ここで、myimageは元の画像を保存したNSDataオブジェクトです。例では、画面のスケールを使用しました。元の画像に別のスケールを使用する場合は、代わりにその値を使用してください。

6
Mikiko Jane

関数UIImagePNGRepresentationがオプションの値を返すため、データでif-letブロックを使用して、アプリのクラッシュとコードの安全な実行を防止します。

if let img = UIImage(named: "TestImage.png") {
    if let data:Data = UIImagePNGRepresentation(img) {
       // Handle operations with data here...         
    }
}

注意: データ is Swift 3+class。NSDataの代わりにSwift 3+

一般的な画像操作(pngとjpgの両方など):

if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
        if let data:Data = UIImagePNGRepresentation(img) {
               handleOperationWithData(data: data)     
        } else if let data:Data = UIImageJPEGRepresentation(img, 1.0) {
               handleOperationWithData(data: data)     
        }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

拡張子を使用して:

extension UIImage {

    var pngRepresentationData: Data? {
        return UIImagePNGRepresentation(img)
    }

    var jpegRepresentationData: Data? {
        return UIImageJPEGRepresentation(self, 1.0)
    }
}

*******
if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
      if let data = img.pngRepresentationData {
              handleOperationWithData(data: data)     
      } else if let data = img.jpegRepresentationData {
              handleOperationWithData(data: data)     
     }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}
0
Krunal

これを確認してください: http://www.nixwire.com/getting-uiimage-to-work-with-nscoding-encodewithcoder/

それはまさにあなたの問題の解決策だと私が思うものを持っています。 NSDataからイメージを作成することはできません。たとえそれが常識で示されていることであってもです。 UIImagePNGRepresentationを使用する必要があります。これで効果があるかどうかをお知らせください。

0
Dylan Gattey