掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
透明ありの PNGファイルの解像度を変更する方法 (ID:151629)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
PNGファイルは大きく3種類あるようですが、 ①非透過性 ②ビット透過性 ③アルファ値(アルファチャネル)付き透過性 今般の場合は③の場合のPNGファイルのようですね。 アルゴリズムがニアレストネイバー(近接近傍法)で良いのであれば、以下ソースコードでは如何でしょうか。 バイキュービック法が良いのであれば、以下URLを参考にして、ソースコード作成する必要があります。 https://mam-mam.net/delphi/bicubic.html (↑アルファチャネル付きの透過型画像は考慮していないので。) procedure TForm1.Button1Click(Sender: TObject); Type TRGB=record B,G,R:Byte; end; TRGBArr=array[0..30000] of TRGB; PRGBArr=^TRGBArr; TRGBArrArr=array[0..30000] of PRGBArr; TAlphaArrArr=array[0..30000] of pByteArray; var Pngf,Pngt:TPngImage; x,y:Integer; rate:Single; RGBf,RGBt:TRGBArrArr; Alphaf,Alphat:TAlphaArrArr; begin pngf := TPngImage.Create; try pngf.LoadFromFile('..\..\f2.png'); if Pngf.TransparencyMode=ptmPartial then begin rate:=2;//2倍に拡大する場合 pngt := TPngImage.Create; try Pngt.Assign(Pngf); Pngt.SetSize(Trunc(Pngf.Width*rate),Pngf.Height*Trunc(rate)); for y := 0 to pngf.Height-1 do begin RGBf[y]:=pngf.Scanline[y]; Alphaf[y]:=pngf.AlphaScanline[y]; end; for y := 0 to pngt.Height-1 do begin RGBt[y]:=pngt.Scanline[y]; Alphat[y]:=pngt.AlphaScanline[y]; end; for y := 0 to pngt.Height-1 do begin for x := 0 to pngt.Width-1 do begin RGBt[y][x].R:=RGBf[Trunc(y/rate)][Trunc(x/rate)].R; RGBt[y][x].G:=RGBf[Trunc(y/rate)][Trunc(x/rate)].G; RGBt[y][x].B:=RGBf[Trunc(y/rate)][Trunc(x/rate)].B; Alphat[y][x]:=Alphaf[Trunc(y/rate)][Trunc(x/rate)]; end; end; pngt.SaveToFile('..\..\t.png'); finally pngt.Free; end; end else if Pngf.TransparencyMode=ptmBit then showmessage('PNG画像はビット透過サポートでアルファ値は含んでいない') else //Pngf.TransparencyMode=ptmNoneの場合 showmessage('PNG 画像は透過性をサポートしていません'); finally pngf.Free; end; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.