質問

NSImageを新しいファイル(png、jpg、...)として特定のディレクトリに保存するにはどうすればよいですか?

役に立ちましたか?

解決

次のようなことを行います: ジェネラコディセタグプレ

他のヒント

このようにNSImageにカテゴリを追加できます ジェネラコディセタグプレ

「TIFFRepresentation」の呼び出しは不可欠です。そうしないと、有効な画像を取得できない可能性があります。

残りの人についてはよくわかりませんが、エンチラーダを全部食べるのが好きです。上記の内容は機能し、問題はありませんが、いくつかの問題がありませんでした。ここで私は私の観察を強調します:

  • 最初に、72DPIのように見える最良の表現が提供されます 画像の解像度がそれより大きくても。だからあなたは負けています 解決策
  • 次に、アニメーションGIFやアニメーションGIFなどの複数ページの画像についてはどうでしょうか。 PDF。アニメーションGIFを試してみてください。アニメーションが失われていることがわかります
  • 最後に、EXIF、GPSなどのメタデータはすべて失われます...データは失われます。

    それで、その画像を変換したいのなら、本当にこれらすべてを失いたいですか? 完全な食事を食べたい場合は、読み進めましょう...

    時々、そして私は時々、古き良き学校の発展に勝るものはないということを意味します。ええ、それは私たちが少しの仕事をしなければならないことを意味します!

    始めましょう:

    NSDataにカテゴリを作成します。これらはクラスメソッドです。これらのものをスレッドセーフにしたいので、スタックに自分のものを置くことほど安全なものはありません。非マルチページ画像の出力とマルチページ画像の出力の2種類の方法があります。

    単一画像のリスト: JPG、PNG、BMP、JPEG-2000

    複数の画像のリスト: PDF、GIF、TIFF

    最初に、メモリ内に可変データスペースを作成します。 ジェネラコディセタグプレ

    2番目にCGImageSourceRefを取得します。ええ、すでに醜く聞こえますね。それほど悪くはありません。続けましょう...データの表現やNSImageチャンクではなく、ソース画像が本当に必要です。ただし、小さな問題があります。ソースに互換性がない可能性があるため、UTIをCGImageSourceCopyTypeIdentifiers()からリストされているものと照合してください

    一部のコード: ジェネラコディセタグプレ

    ちょっと待ってください、なぜNSImageがあるのですか?メタデータがなく、CGImageSourceがサポートしていない形式もありますが、これらは有効な画像です。例として、古いスタイルのPICT画像があります。

    これでCGImageSourceRefができました。それがゼロでないことを確認してから、CGImageDestinationRefを取得しましょう。これらすべての参照を追跡する必要があります。これまでのところ2です!

    この関数を使用します:CGImageDestinationCreateWithData()

    • 1番目のパラメータはimageData(キャストCFMutableDataRef)です
    • 2番目のパラメータは出力UTIです。上記のリストを覚えておいてください。 (例えば。 kUTTypePNG)
    • 3番目のパラメータは、保存する画像の数です。単一の画像ファイルの場合、これ は1です。それ以外の場合は、次を使用できます。

      CGImageSourceGetCount(imageSource);

    • 4番目のパラメータはゼロです。

      このCGImageDestinationRefがあるかどうかを確認してから、ソースから画像を追加しましょう...これにはすべてのメタデータも含まれ、解像度が保持されます。

      複数の画像の場合、ループします: ジェネラコディセタグプレ

      単一の画像の場合、インデックス0の1行のコードです: ジェネラコディセタグプレ

      わかりました。ディスクまたはデータコンテナに書き込むようにファイナライズします。 ジェネラコディセタグプレ

      これにより、最初から可変データにすべての画像データとメタデータが含まれるようになります。

      もう終わりましたか?ほとんどの場合、ガベージコレクションを使用しても、クリーンアップする必要があります。 ソース用と宛先用の2つの参照を覚えておいてください。CFRelease()を実行してください

      これで完了です。最終的には、メタデータや解像度などをすべて保持する変換された画像になります...

      私のNSDataカテゴリメソッドは次のようになります: ジェネラコディセタグプレ

      サイズ変更またはICO / ICNSはどうですか? これは別の日ですが、要約すると、最初にサイズ変更に取り組みます...

      1. 新しいサイズのコンテキストを作成します:CGBitmapContextCreate()
      2. インデックスから画像参照を取得します:CGImageSourceCreateImageAtIndex()
      3. メタデータのコピーを取得します:CGImageSourceCopyPropertiesAtIndex()
      4. 画像をコンテキストに描画します:CGContextDrawImage()<
/ li>
  • サイズ変更された画像をコンテキストから取得します:CGBitmapContextCreateImage()
  • 次に、画像とメタデータを宛先参照に追加します:CGImageDestinationAddImage()

    ソースに埋め込まれている複数の画像について、すすぎ、繰り返します。

    ICOとICNSの唯一の違いは、一方が単一の画像であり、もう一方が1つのファイル内の複数の画像であるということです。あなたはどれがどれであるかを推測できるに違いない?!;-) これらの形式の場合、特定のサイズにサイズを変更する必要があります。そうしないと、エラーが発生します。 プロセスは、適切なUTIを使用する場合とまったく同じですが、サイズ変更は少し厳密です。

    これが他の人の助けになることを願っています。あなたは今と同じくらい満員です!

    おっと、言及するのを忘れた。NSDataオブジェクトを取得したら、writeToFile、writeToURLなど、必要に応じて実行するか、必要に応じて別のNSImageを作成します。

    ハッピーコーディング!

  • swift3を使用してPNGとして保存 ジェネラコディセタグプレ

    Swift4.2ソリューション ジェネラコディセタグプレ

    スウィフトスタイル: ジェネラコディセタグプレ

    SWIFTを使用したアプローチが機能することが保証されているもう1つ:

    ユーザーが任意の画像をドロップできる「ImageWell」があります。そして、この「Image Well」には、アウトレット経由でアクセスされる(タイプNSImageの)画像プロパティがあります: ジェネラコディセタグプレ

    この画像を保存するコード(ボタンアクション内に配置できます)は次のとおりです。 ジェネラコディセタグプレ

    指定されたコードの1行目で、ImageWellに画像があるかどうかを確認します。

    2行目では、その画像のビットマップ表現を作成します。

    3行目で、BitmapRepresentationを圧縮係数が「1」(圧縮なし)に設定されたJPGタイプに変換します。

    4行目では、指定されたパスでJPGデータを保存します。「atomically:true」は、ファイルが1つのピースとして保存され、操作が成功することを保証することを意味します。

    N.B。: 3行目に別のNSBitmapImageFileTypeを使用して、画像を別の形式で保存できます。たくさんあります: ジェネラコディセタグプレ

    など

    クロスプラットフォームコードを支援するために、Macで実行される(そしてUIImagePNGRepresentation()を使用する)バージョンのNSImageを実装しました。 ジェネラコディセタグプレ

    使用法: ジェネラコディセタグプレ

    ライセンス: CC-BY-SA帰属
    所属していません StackOverflow
    scroll top