Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

大きすぎる(16777216ピクセルを超える)画像が処理できない #6

Closed
tamaina opened this issue Apr 13, 2023 · 13 comments

Comments

@tamaina
Copy link

tamaina commented Apr 13, 2023

https://misskey.io/notes/9di5jzpy1b

https://misskey.io/notes/9di6cdvew1

@tamaina tamaina changed the title EOS R5 で撮影した写真をiOS Safariで処理させると真っ黒になる EOS R5 で撮影した写真をiOS Safariで処理させると(結果的にMisskeyでは)真っ黒になる Apr 13, 2023
@tamaina
Copy link
Author

tamaina commented Aug 8, 2023

(Canon のアプリで iPhone に取り込むとなんだか変なファイルが作成されるらしいという噂は聞く)

@syuilo
Copy link
Member

syuilo commented Aug 8, 2023

サイズがデカすぎるとか?

@tamaina
Copy link
Author

tamaina commented Aug 8, 2023

サイズのデカさは関係ない気がする

@tamaina
Copy link
Author

tamaina commented Aug 8, 2023

というかCanonのアプリでiPhoneで取り込んだファイル自体がとりあえず欲しい

@Soli0222
Copy link

おそらくこのIssue(misskey-dev/misskey#12026) と同じ問題かと思うのですが、iOS SafariのWebインスペクタを確認すると、Canvas area exceeds the maximum limit (width * height > 16777216).と表示されており、iOS Safariでの制約に当たってしまうことが原因であると考えています。

また、原因の箇所はscaling_operations.tsの125行目、converting = new OffscreenCanvas(bmp.width, bmp.height);であることも特定しており、Canvasのサイズを500*500にして16777216ピクセルを超える画像をアップロードしたところ、真っ黒にはならないことを確認しています。

原因は特定しましたが、修正方法が分からず、コメントにて失礼します。

@kyong
Copy link

kyong commented Dec 11, 2023

Canonの写真に限らず、iPhone15Proで撮影した写真では高確率で真っ黒になります。
(マクロモードで撮影した写真はアップロードできる)
再現できるサンプルを添付します。
IMG_7370.jpeg.zip

@samunohito
Copy link
Member

scaling_operations.tsのscaleImage()にて、OffscreenCanvasの総ピクセル数が167777216を突破しないように上限を設けるようにしたらいかがでしょうか。
自分の手元の環境でbrowser-image-resizerをMisskeyのworkspaceに組み入れて下記ソースを当てて動かしてみたところ、iPhone/Safariから大きな画像(未対処だと黒い画像になるもの)をアップロードしても黒い画像となりませんでした。

内容としては、縦横の比率を維持したまま167777216ピクセルに収まるようにcanvasの縦横サイズを調節するという物です。

function calcLimitSize(size: { width: number, height: number }, maximumPixels: number) {
	const { width, height } = size;
	const requiredPixels = width * height;
	if (requiredPixels <= maximumPixels) {
		return size;
	}

	const aspectRatio = width / height;
	const newWidth = Math.sqrt(maximumPixels * aspectRatio);
	const newHeight = Math.sqrt(maximumPixels / aspectRatio);

	return {
		width: Math.floor(newWidth),
		height: Math.floor(newHeight),
	};
}

export async function scaleImage({ img, config }: {
	img: ImageBitmapSource | OffscreenCanvas;
	config: BrowserImageResizerConfig;
}) {
	if (config.debug) {
		console.log('browser-image-resizer: Scale: Started', img);
	}
	let converting: OffscreenCanvas;

	if (img instanceof OffscreenCanvas) {
		converting = img;
	} else {
		const bmp = await createImageBitmap(img);
                // 比率を維持したまま
		const limitSize = calcLimitSize({ width: bmp.width, height: bmp.height }, 16777216)
		converting = new OffscreenCanvas(limitSize.width, limitSize.height);
		converting.getContext('2d')?.drawImage(bmp, 0, 0);
	}

	if (!converting?.getContext('2d')) throw Error('browser-image-resizer: Canvas Context is empty.');

        ....

@samunohito
Copy link
Member

(safari以外でも問答無用に動いてしまうので、改善する必要あります…)

@tamaina
Copy link
Author

tamaina commented Jan 19, 2024

#6 (comment)

この例だと画像がはみ出そう

 		converting.getContext('2d')?.drawImage(bmp, 0, 0);

 		converting.getContext('2d')?.drawImage(bmp, 0, 0, limitSize.width, limitSize.height);

にする必要がある

@tamaina tamaina changed the title EOS R5 で撮影した写真をiOS Safariで処理させると(結果的にMisskeyでは)真っ黒になる 画像が大きすぎる(16777216ピクセルを超えるもの)が処理できない Jan 19, 2024
@tamaina tamaina changed the title 画像が大きすぎる(16777216ピクセルを超えるもの)が処理できない 画像が大きすぎる(16777216ピクセルを超える)画像が処理できない Jan 19, 2024
@tamaina tamaina changed the title 画像が大きすぎる(16777216ピクセルを超える)画像が処理できない 大きすぎる(16777216ピクセルを超える)画像が処理できない Jan 29, 2024
@tamaina
Copy link
Author

tamaina commented Jan 29, 2024

何これ?iOS Safariだけ制限が辛い(macOS Safariは大丈夫)な仕様なんか??

@tamaina
Copy link
Author

tamaina commented Jan 29, 2024

@tamaina
Copy link
Author

tamaina commented Jan 29, 2024

しかも挙動見てるとなんかエラーハンドリングできないんだろうか?

@tamaina
Copy link
Author

tamaina commented Jan 29, 2024

なおした

@tamaina tamaina closed this as completed Jan 29, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants