You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.3 KiB
45 lines
1.3 KiB
export function getPngMetadata(file) { |
|
return new Promise((r) => { |
|
const reader = new FileReader(); |
|
reader.onload = (event) => { |
|
// Get the PNG data as a Uint8Array |
|
const pngData = new Uint8Array(event.target.result); |
|
const dataView = new DataView(pngData.buffer); |
|
|
|
// Check that the PNG signature is present |
|
if (dataView.getUint32(0) !== 0x89504e47) { |
|
console.error("Not a valid PNG file"); |
|
r(); |
|
return; |
|
} |
|
|
|
// Start searching for chunks after the PNG signature |
|
let offset = 8; |
|
let txt_chunks = {}; |
|
// Loop through the chunks in the PNG file |
|
while (offset < pngData.length) { |
|
// Get the length of the chunk |
|
const length = dataView.getUint32(offset); |
|
// Get the chunk type |
|
const type = String.fromCharCode(...pngData.slice(offset + 4, offset + 8)); |
|
if (type === "tEXt") { |
|
// Get the keyword |
|
let keyword_end = offset + 8; |
|
while (pngData[keyword_end] !== 0) { |
|
keyword_end++; |
|
} |
|
const keyword = String.fromCharCode(...pngData.slice(offset + 8, keyword_end)); |
|
// Get the text |
|
const text = String.fromCharCode(...pngData.slice(keyword_end + 1, offset + 8 + length)); |
|
txt_chunks[keyword] = text; |
|
} |
|
|
|
offset += 12 + length; |
|
} |
|
|
|
r(txt_chunks); |
|
}; |
|
|
|
reader.readAsArrayBuffer(file); |
|
}); |
|
}
|
|
|