クリップボードに画像をコピーする

Recipe ID: sys-009

画像をクリップボードにコピーする方法を解説します。
スクリーンショットの共有機能などで役立ちます。

前提条件

プラグインのインストール

clipboard-manager プラグインと、画像ファイルの読み込みに使用する fs プラグインが必要です。

npm run tauri add clipboard-manager
npm run tauri add fs

Permissions (権限) の設定

src-tauri/capabilities/default.json に以下の権限を追加します。

{
    "permissions": [
        "clipboard-manager:default",
        "clipboard-manager:allow-write-image",
        ...,
        "fs:default" 
    ]
}

(※ fs:default はサンプルコードでファイル読み込みを行うために追加しています)

1. フロントエンドから作成する (TypeScript)

@tauri-apps/plugin-clipboard-managerwriteImage(image) 関数を使用します。引数の imagetauri-apps/api/imageImage オブジェクトである必要があります。

1. 画像ファイル(Uint8Array)からコピーする例

バイナリデータを Image.fromBytes() で変換してコピーします。

import { writeImage } from '@tauri-apps/plugin-clipboard-manager';
import { Image } from '@tauri-apps/api/image';
import { readFile } from '@tauri-apps/plugin-fs';

async function copyImageFile(filePath: string) {
  try {
    // 1. ファイルをバイナリとして読み込み
    // (事前に @tauri-apps/plugin-fs のセットアップが必要です)
    const buffer = await readFile(filePath);
    
    // 2. Image オブジェクトを作成
    const image = await Image.fromBytes(buffer);

    // 3. クリップボードへ書き込み
    await writeImage(image);
    
    console.log('画像をコピーしました');
  } catch (error) {
    console.error('画像のコピーに失敗しました', error);
  }
}

@tauri-apps/api/image は Tauri v2 コア API を使用します。

2. バックエンドから作成する (Rust)

Rust 側でも tauri::image::Imagetauri_plugin_clipboard_manager::ClipboardExt を使用して画像をコピーできます。

依存関係の確認 (Rust)

tauri の features に image が必要になる場合がありますが、標準で含まれていることが多いです。

Rust 実装

ローカルの画像ファイルを読み込んでクリップボードにセットする例です。

use tauri::command;
use tauri_plugin_clipboard_manager::ClipboardExt;
use tauri::image::Image;
use std::fs;

#[command]
fn copy_image_from_rust(app: tauri::AppHandle, file_path: String) -> Result<(), String> {
    // ファイルからバイト列を読み込み
    let bytes = fs::read(&file_path).map_err(|e| e.to_string())?;
    
    // Tauri の Image オブジェクトに変換
    let image = Image::from_bytes(&bytes).map_err(|e| e.to_string())?;
    
    // クリップボードに書き込み
    app.clipboard().write_image(&image).map_err(|e| e.to_string())?;
    
    Ok(())
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .plugin(tauri_plugin_clipboard_manager::init())
        .invoke_handler(tauri::generate_handler![copy_image_from_rust])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

フロントエンドからの呼び出し

import { invoke } from '@tauri-apps/api/core';

invoke('copy_image_from_rust', { filePath: '/path/to/image.png' })
  .then(() => console.log('Image copied from Rust!'))
  .catch(console.error);