配色データ(拡張子.aco)があるのだけど、編集できるソフトがadobeのものが多くて、読み込みにしか対応していないことがある。 ChatGPTに「以下のC#コードをJavascriptで書き直して下さい。」の下に下記サイトのサンプルコードを乗せただけ。
そうしたら、acoファイルを読み込んで表示するプログラムが出力された。 「編集結果を保存できるように書き換えて」
ChatGPT「編集結果を保存できるようにするために、ユーザーが編集した色のデータをJSONファイルとしてダウンロードできる機能を追加します。以下はそのための改良版です。」
「jsonではなくACOファイルとして保存するように変更して。」
そしたらACOファイルを編集するプログラムができた。
UIを整えたり項目を増やしたり減らし、HTMLの色コードを読み込ませたりすると完成になりそう。
使用方法 ブラウザでファイルを開く:
index.htmlファイルをブラウザで開きます。 ACOファイルのインポート:
「*.aco」ファイルをインポートするために、ファイル入力ボックスにACOファイルをドラッグ&ドロップするか、クリックしてファイルを選択します。 「Import」ボタンが有効になるので、クリックしてACOファイルを読み込みます。 色の編集:
インポートされた色がリストで表示されます。 各色のカラーピッカーを使用して色を変更できます。色を変更すると、そのRGB値もラベルに表示されます。 ACOファイルの保存:
色の編集が完了したら、「Save」ボタンをクリックしてACOファイルを保存します。 ブラウザがファイルをダウンロードし、新しいACOファイルが保存されます。 注意点 このコードは、ブラウザのFile APIを使用しているため、ローカルファイルシステムへのアクセスを必要とします。一部のブラウザや環境では動作しない場合があります。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Aco Importer</title>
<style>
.color-box {
display: flex;
align-items: center;
margin: 10px 0;
}
.color-box input[type="color"] {
margin-right: 10px;
}
</style>
</head>
<body>
<h1>Aco Importer</h1>
<input type="file" id="fileInput" accept=".aco">
<button id="importButton" disabled>Import</button>
<button id="saveButton" disabled>Save</button>
<div id="colorList"></div>
<script src="acoImporter.js"></script>
</body>
</html>
document.addEventListener('DOMContentLoaded', () => {
const fileInput = document.getElementById('fileInput');
const importButton = document.getElementById('importButton');
const saveButton = document.getElementById('saveButton');
const colorList = document.getElementById('colorList');
let colors = null;
fileInput.addEventListener('change', () => {
if (fileInput.files.length > 0) {
importButton.disabled = false;
} else {
importButton.disabled = true;
saveButton.disabled = true;
}
});
importButton.addEventListener('click', () => {
const file = fileInput.files[0];
if (file) {
const reader = new FileReader();
reader.onload = function(event) {
const arrayBuffer = event.target.result;
colors = getColors(new Uint8Array(arrayBuffer));
displayColors(colors);
saveButton.disabled = false;
};
reader.readAsArrayBuffer(file);
}
});
saveButton.addEventListener('click', () => {
if (colors) {
const acoData = createAcoFile(colors);
download('colors.aco', acoData);
}
});
function displayColors(colors) {
colorList.innerHTML = '';
colors.forEach(color => {
const colorBox = document.createElement('div');
colorBox.classList.add('color-box');
const colorInput = document.createElement('input');
colorInput.type = 'color';
colorInput.value = rgbToHex(color.R, color.G, color.B);
colorInput.addEventListener('input', (event) => {
const hex = event.target.value;
const rgb = hexToRgb(hex);
color.R = rgb.r;
color.G = rgb.g;
color.B = rgb.b;
color.Color = `rgba(${color.R}, ${color.G}, ${color.B}, 1)`;
});
const label = document.createElement('label');
label.textContent = rgbToHex(color.R, color.G, color.B);
colorBox.appendChild(colorInput);
colorBox.appendChild(label);
colorList.appendChild(colorBox);
});
}
function getColors(array) {
const colors = [];
const colorCount = array[3];
let pos = 6;
for (let i = 0; i < colorCount; i++) {
const R = array[pos];
const G = array[pos + 2];
const B = array[pos + 4];
const color = {
R,
G,
B,
Color: `rgba(${R}, ${G}, ${B}, 1)`
};
colors.push(color);
pos += 10;
}
return colors;
}
function rgbToHex(r, g, b) {
return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1).toUpperCase();
}
function hexToRgb(hex) {
const bigint = parseInt(hex.slice(1), 16);
return {
r: (bigint >> 16) & 255,
g: (bigint >> 8) & 255,
b: bigint & 255
};
}
function createAcoFile(colors) {
const buffer = new ArrayBuffer(4 + colors.length * 10);
const view = new DataView(buffer);
view.setUint16(0, 0); // version
view.setUint16(2, colors.length); // color count
let pos = 4;
colors.forEach(color => {
view.setUint16(pos, 0); // color space (0 = RGB)
view.setUint16(pos + 2, color.R * 256); // R
view.setUint16(pos + 4, color.G * 256); // G
view.setUint16(pos + 6, color.B * 256); // B
view.setUint16(pos + 8, 0); // padding
pos += 10;
});
return new Blob([buffer], { type: 'application/octet-stream' });
}
function download(filename, data) {
const element = document.createElement('a');
element.href = URL.createObjectURL(data);
element.download = filename;
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
});
問題は出力されたファイルが、acoの仕様に沿っていないことだ。 qiita.com