Delphi5を使っています。初心者です。
Jpeg画像を回転させたいのですが、
どうすれば良いのかまったくわかりません。
どなたかご教授お願い致します。
Bitmapに変換して、それを回転させ、最後にJpegに変換するのがいいかと。
いったんBitmapにして回転させてまたJpegに戻すというのはわかりやすいですが
回数を重ねるごとに画像が劣化しますので注意してください。
Bitmap<->Jpegの例
http://homepages.borland.com/efg2lab/Graphics/BMPJPG.htm
Bitmap回転の例
http://homepages.borland.com/efg2lab/ImageProcessing/RotateScanline.htm
Jpegで劣化しない回転方法もあるようです。
http://jpegclub.org/losslessapps.html
探してみてください。
Jpegの回転Losless版
Jpegの本家IJGにjpegtranというのがありました。
http://www.ijg.org/
配布ソースコードに含まれています。(C言語)
Pascal移植版はこちら
http://www.nomssi.de/pasjpeg/pasjpeg.html
pasjpegというのがそうです。
ややこしそうですが参考にしてください。
deldelさん、ありがとうございました。
kkkさん、何度もありがとうございます。
うっ、英語ですね・・・トライしてみます。
今後ともよろしくお願い致します。
ベカさんの本当に知りたいことがどのあたりなのか不明ですが。
Bitmapに変換後回転させるコード例であれば
http://madia.world.coocan.jp/ が参考になります。
ここから プログラミング Borland Delphi / Graphic Effect をたどります。
左右90度、180度、左右対称、上下対象のコード例です。
角度を指定しての回転コード例は
http://wblue.web.infoseek.co.jp/prog/one/o004.htm がお勧めです。
JPG の劣化無し回転(及びトリミング)であれば、KKk さんの IJG(JPEGTran)
が定番のようです。
私も研究中ですが、PasJPEG は使い方を解析するのが大変かと。
C のコードからでも同様の感じです。
私は今、次よりダウンロードできるソースを勉強しています。(Delphi4)
http://www.polamar.net/fotoview/index.htm
同頁よりDLできる、JPEFTran を使ったフリーソフトのソースコードです。
挑戦しようという方があれば、私と情報交換をしていただけませんか。
> うっ、英語ですね
JPG <--> BMP 相互変換であれば
http://madia.world.coocan.jp/delphi/DelphiTips.htm
でも紹介されています。
TBitmap.ScanLine の使用経験がもしなければ、理解に少し骨がおれるでしょうが、以上紹介したコードをコピー&ペーストで繋げば、とりあえず実現できるはずです。
本質的に JPEG → BMP の変換では画質の劣化はありません。ですから、BMP の回転操作自体にも画質の劣化はありません。BMP → JPEG のときには画質の劣化がおこります。ですから、最低一回の画質劣化を我慢すると、別名の JPEG ファイルをつくるだけで、BMP の回転の話になります。
TBitmap の ScanLine が自在に操れるのなら、話は簡単です。わたしもやったことがあります。
http://blog.livedoor.jp/junki560/archives/19004116.html
http://blog.livedoor.jp/junki560/archives/19179316.html
GDI+ を使うと、ピクセルフォーマットに依存しないでものすごく簡単に出来ます。
http://blog.livedoor.jp/junki560/archives/22160961.html
>GDI+ を使うと、ピクセルフォーマットに依存しないでものすごく簡単に出来ます。
Delphi6には、GDIPAPI.pas GDIPOBJ.pas が無いんですけど、この2つのファイルの入手方法はありますか?
> Delphi6には、GDIPAPI.pas GDIPOBJ.pas が無いんですけど、この2つのファイルの入手方法はありますか?
ここを見てください。
http://blog.livedoor.jp/junki560/archives/21738032.html
配布場所はここ
http://www.progdigy.com/modules.php?name=gdiplus
WindowsXP ならインポートファイルがあるだけで始められます。
XP 以外の Win98,ME,2000 で .NET FrameWork をインストールしていなければ
gdiplus.dll が必要になります。配布場所はここ
http://www.microsoft.com/downloads/details.aspx?familyid=6a63ab9c-df12-4d41-933c-be590feaa05a&displaylang=en
junkiさんに教えていただいたサイトから必要なファイルを入手して、junkiさんのページにあるサンプルコードを Win98SEでコンパイル、実行することが出来ました。
pngファイルも読めて簡単で、本当にGDI+は魅力的ですね。ありがとうございました。
GDI+は重たいということをよく聞きますが、大丈夫ですか?
> GDI+は重たいということをよく聞きますが、大丈夫ですか?
どうなんでしょうか? ゲームなんかをつくるのは DirextX や OpenGL を
使うことになると思います。
普通に画像処理するのは特に重い感じがしません。
400x300 の 32bit フォーマットの画像を任意角度回転させるのは
わたしの Pen 1Ghz 程度のマシンでも一瞬ですけど。
sadoyamaさん、junkiさん、GDI+さん、ありがとうございます。
ベカです。お礼が遅くなりました。
色々と参考にさせていただきましたが、JPG <--> BMP が一番簡単?の
ようなに思いますのでこれで頑張ってみたいと思います。
JPG画像の回転は非常に難しいのですね・・・
・・実は良く知らないのにエラソーな事を述べます。間違ってたらゴメンナサイ
>本質的に JPEG → BMP の変換では画質の劣化はありません。
この部分引っかかります。
JPEGはYUVで記録されてますよね。対するBMPはRGBです。
YUV->RGBにした時点で(グレーで無い限り)ある程度の誤差が発生します。
JPEGをデコードしただけではロスはないかもしれませんが(但し、以下のサイトにはデコードするだけで誤差が発生するというような記述があります)
BMPに変換すればそこで演算誤差は発生すると思います。
一般的にそこまで気を使う必要は無い、という意見には賛成ですが。
http://aor.ktplan.jp/hms/jpegfaq1#colorQuantization
>>本質的に JPEG → BMP の変換では画質の劣化はありません。
>この部分引っかかります。
junkiさんは初心者向けの説明において細かなことをわざと隠されたんでしょう。
厳密に言えばウォレスさんのおっしゃる通りですよね。
グラフィックソフトの中でJpegからBmpに変換で独自のやり方で高精度化していると宣伝しているものもありましたし。
>ですから、BMP の回転操作自体にも画質の劣化はありません。
これも同様に回転すれば画像は劣化します。(90度単位以外では)
ただ Bmp->Jpegに比べたらはるかに小さいはずなので一般的な用途では気を使わなくても良いのでしょうね。
> JPG画像の回転は非常に難しいのですね・・・
と思っていましたが、Junki さんに教えていただいた GDI+ を使ってみたところ、
コードの意味は解らないものの、簡単に実現できました。
http://www.progdigy.com/modules.php?name=gdiplus
から DL した Demos の
Transforming a JPEG Image Without Loss of Information
フォルダに、劣化なし回転のサンプルコードがありました。
96 回転させてみましたが、問題ないようです。
90, 180, 270 以外の回転も Junki さんのサンプルがあるので簡単です。
Demos のサンプルでは、TImage のような旧GDIコンポとの連携が不明ですが、
Junki さんのコードはそこまで示してくれているので、私でも何とか使えそうです。
Junki さんのコードが無ければ、GDI+ を使うのは無理がありました。
いろいろ調べましたが、GDI+ についてきちんと紹介されているサイトは他に見つかりませんでした。
素晴らしいサイトを作っていただき感謝しています。
GDI+ のネックは、Windows95 で使えないこと、
便利な反面、BlackBox が増えて、GDI+ が用意した範囲内の処理しかできないこと、
EMF の扱いの事例が見当たらないこと、でしょうか。
こんにちは
> GDI+ のネックは、Windows95 で使えないこと
これは MS が正式にサポートしてない、と言う意味です。
わたしの持っている本では、Windows95 でも使える、と書いてありました。
すみません、連投です。
>便利な反面、BlackBox が増えて、GDI+ が用意した範囲内の処理しかできないこと、
そうですね。でも、VCL とは違って実装がすっきりしていて簡単です。また、すべて
のイメージ処理は、TGPBitmap で行いますから、統一的なコードを書けます。
また、VCL の TBitmap.ScanLine に相当するアクセスもできますから、ほとんど
ブラックボックスは無い、と思っています。ドキュメントも C# のコードが
読めれば有り余るほどあります。
>EMF の扱いの事例が見当たらないこと、でしょうか。
これは、GDI の実装とほとんど同じで、内部処理が実数化されて精度があがって
いるくらいしか差がないためです。リージョンについてもオブジェクト化されて
便利になったくらいしか目新しいことが無いのでコード例は少ないです。
GDI と大差ない部分は面白くないのであまり扱いたくないです。
ツイート | ![]() |