MainPage 〜きまぐれ ぷろぐらま語録〜
 

2024年3月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28
29
30
31            

最近の記事
Blog移転

エアポート2010を見た

花椒油

Steve Jobs,1955-2011

鉄球に無数のとげが付いた武器

M55→M42(T)が欲しい

健康診断done

回転寿司のルール

相模湖リゾート・プレジャー・フ ..

過去ログ 【表示/最小化】
2011年10月
2011年 9月
2011年 8月
2011年 7月
2011年 6月
2011年 5月
2011年 4月
2011年 3月
2011年 2月
2011年 1月
2010年12月
2010年11月
2010年10月
2010年 9月
2010年 8月
2010年 7月
2010年 6月
2010年 5月
2010年 4月
2010年 3月
2010年 2月
2010年 1月
2009年12月
2009年11月
2009年10月
2009年 9月
2009年 8月
2009年 7月
2009年 6月
2009年 5月
2009年 4月
2009年 3月
2009年 2月
2009年 1月
2008年12月
2008年11月
2008年10月
2008年 9月
2008年 6月
2008年 5月
2008年 4月
2008年 3月
2008年 2月
2008年 1月
2007年12月
2007年11月
2007年10月
2007年 9月
2007年 8月
2007年 7月
2007年 6月
2007年 5月
2007年 4月
2007年 3月
2007年 2月
2007年 1月
2006年12月
2006年11月
2006年10月
2006年 9月
2006年 8月
2006年 7月
2006年 6月
2006年 5月

広告欄

 

Blogを移転させました。
新Blogは次のURLです。
https://kerokero.org/wp/




JpegBitmapEncoderは画質が悪い。特に純色赤とか。
ちょっと、故あって、C#でJpegファイルを生成するプログラムを書いた。

C#には、JpegBitmapEncoderなる、素敵なクラスがあるから楽勝♪
とか思っていたら、どうも、できあがったJpegの画質が悪い。

もちろん、Jpegの品質値は100にしていているにもかかわらず、純色赤の線とかがくすむ。

いろいろ調べてみた結果どうやら、こういうことらしい。

つまり、Jpegというのは、乱暴な説明をすると、
DCT(離散コサイン変換)という演算をして、
人間の目には目立つ成分と、目立たない成分に分けて、
目立たない成分を削除することで、データ量を減らす画像形式なんだけど、
その、DCT計算したあとに、どれぐらい間引くかが、いわゆるJpegの品質値。

だけど、そもそも、そのDCT演算の前に、
Jpeg画像にはくいくつかの色モードがある。
モノクロとか、RGBフルカラーとか、CMYKフルカラーとか。

で、一般的なJpeg画像は、YCrCbの色で管理されている。
輝度と、赤の色差、青の色差ね。

ところで、人間の目は、輝度の変化には強いけど、
色の変化は結構鈍感なので、
なので、色差信号を間引くことで、画像の容量を減らすという手法がある。

で、話に戻って、JpegBitmapEncoderですが、
どうやら、輝度に対して色差の情報量を
1/4に減らす色成分(YCC=411)を採用で保存しているらしい。
なので、どうしても、純色の赤や青がくすんでしまうのが原因ということらしい。

じゃあ、色差を間引かない色成分(YCC=444)を使おうと思ったら、
JpegBitmapEncoderは、このあたりは変更できないらしい。

仕方がないので、前述のサイト同様に、libJpegを使うことに。

一部のExifも使いたかったり、なんやかんやしたかったので、
libJpegをラッピングするDLLをC++で書いて、
それを、C#から呼び出すという方法に落ち着いた。

手順をざっくりまとめるとこんな感じ:
1,libJpegを入手して、C++libの新規プロジェクトを作成して、libjpeg.libの生成。
2,C++DLLの新規プロジェクトを作成して、
  libjpeg.libを使ってやりたいことをやるための関数を作て、DLL化する。
3,さらにC++コンソールの新規プロジェクトを作成して、
  今作ったDLLのテストプログラムをC++で書く。で、テスト。
4,さらにC#の新規プロジェクトを作成して、
  C#からC++のDLLを呼ぶ作法に基づいてC#からDLLのコール。

ちなみに、今回自分は、
foo(ストアファイル名(jpeg),ソースファイル名(bmp),品質,ExifのCreateDateTime…【必要なExif情報を引数で】);
みたいな関数を持つDLLを用意した。
つまり、保存したい画像を、一度、BMPファイルにして
それを経由で受け渡している。
このへんは、もっとスマートな方法があると思う。


それにしても、おかげで、C++でDLLやlibを生成する復習が出来たし、
C#からC++のDLLの呼び出しや、Exifのデータ構造等の良い勉強になった。


・・・でも、疲れた・・・

というのも、JpegBitmapEncoderで画質について調べると、
QAサイトに結構引っかかるけど、
「品質値を100にしろ」とか「Jpegなんだから劣化が当たり前」
という回答ばっかり。

質問者が「他のJpeg圧縮のソフトに比べて、
品質を100にしても画質が悪い原因を知りたい」
みたいなことを書いていても・・・だ。

かなり、今回の記事の情報は検索に引っかかりにくいので、
この記事が、誰かの参考になればと思う。
03:14, Saturday, Oct 09, 2010 ¦ 固定リンク ¦ 携帯


■コメント

■コメントを書く

※コメントの受け付けは終了しました

△ページのトップへ
 

最新のつぶやき

サイト内検索
カスタム検索

旅行関係の記事等
九州・広島旅行記 2009(かみちゅ!)
大阪出張(KANON)
大阪出張(ハルヒ)
三宅島旅行記'05
三宅島旅行記'08
三宅島旅行記'10
伊豆半島小旅行

最近のコメント

最近のトラックバック

IPv4枯渇時計

携帯で読む
   URLを携帯に送る





[Valid RSS]

Powered by CGI RESCUE