VB2005 でビットの深さ8の画像を処理したい。
VB2005を使って簡単な画像処理のツールを制作しています。
処理内容は、画像ファイル(jpg)を読み込み、画像を縦に区切って
左側と右側を別のファイルに保存する、という処理です。
縦に区切る位置(x 座標)は、自由に指定できます。
上記のような処理を「任意の解像度(0~300 dpi)、ビットの深さ 8 」
の画像で行うには、どのようにしたらよいのでしょうか。
(ビットの深さ 8 の image からは Graphics オブジェクトを
作ることができず、そのため、読み込んだ画像の解像度を
保てませんでした。)
ビットの深さが 24 の画像は、以下のようにして問題なく動きました。
"scanfile01.jpg" は、
解像度 300dpi / ビットの深さ 24 / 縦1500 × 横1200 ピクセル
の画像ファイルです。
---------------
private sub splitImage()
'画像(src)の読み込み
Dim fs As New IO.FileStream("scanfile01.jpg", _
IO.FileMode.Open)
Dim src As Image = Image.FromStream(fs, False, False)
Dim srcG As Graphics = Graphics.FromImage(src) '解像度の取得用
'src を分割する位置(x座標)
'(横幅1500 の scanfile01.jpg を左右半分に分ける)
Dim cutx As Integer = 750
'src の左側を格納する Bitmap を新規作成
'(src の解像度を引き継ぐ)
Dim destLeft As Image = New Bitmap(cutx, src.Height, srcG)
Dim rect As New Rectangle(0, 0, cutx, src.Height)
Dim destLeftG As Graphics = Graphics.FromImage(destLeft)
Dim rect As New Rectangle(0, 0, cutx, src.Height)
destLeftG.DrawImage(src, 0, 0, rect, GraphicsUnit.Pixel)
'src の左側をファイルに保存
destLeft.Save("scanfile01-left.jpg" _
, System.Drawing.Imaging.ImageFormat.Jpeg)
destLeft.Dispose()
destLeftG.Dispose()
'src の右側を格納する Bitmap を新規作成
~省略~
srcG.Dispose()
src.Dispose()
fs.Dispose()
End Sub
----------------
ビットの深さ 8 の画像を読み込むと、実行時に
Dim srcG As Graphics = Graphics.FromImage(src) '解像度の取得用
の部分で「インデックス付きのピクセルから Graphics オブジェクトを作成できません」というエラーが発生します。
そこで、解像度は引き継がずに、以下のように変更してみました。
・srcG の定義文を削除
・destLeft の定義時に解像度は指定せず、以下のように変更
Dim destLeft As Image = New Bitmap(cutx, src.Height)
すると、エラーは発生せずファイルが作成されましたが、
解像度が引き継がれずに元の画像よりずっと小さな画像になって
作成されていました。
(作成されたファイルを開くと、イメージが小さくなった分、
黒い隙間ができていました。)
300 dpi の画像を読み込んだので、VB2005 で作成される?Bitmap
のデフォルトの解像度 96 dpi に変換される際にピクセル抜けが
発生して画像が小さくなったのだと思います。
ビットの深さ 8 の画像を半分に区切ってファイルに保存する方法は
ないのでしょうか。また、任意の解像度でピクセル抜けが
発生しないようにしたいです。
お礼
回答ありがとうございます。 個人や任意団体のサイトがいいですかー。 そうですねー。情報発信の正当性を促す意味も含めてよさそうです。 しかしというかやはり、重要なサイトの管理がおろそかになりそうです。 賛同をいただける方もいると思いますが、単に潰しの投稿や攻撃が考えられるので、個人は正直無理です。 そうなると、2chやYoutubeと考えましたが、前者は意図した方向ではない爆発や、特定の攻撃がされてしまうことを思うととてもできません。(また、2chで画像をどう公開したらよいのかわからないこともあります。) Youtubeも同じように考えられますが、少しやわらかいのかなと。 IPアドレスの特定も事件性があり、警察などの介入がなければ公開されないと考えていましたが、誤りでしょうか? 一応マスコミに投稿しました。 しかしその他重要な案件や数字的な理由があるのでしょう、何も返答が帰ってきていません。(自分たちもその脅威にあるのに。) 今思うとより公平性の高いマスコミに通報すればよかったのかなと。 でも、ウェブの時代であり個人的な情報も公開できる手段ができたのですから、正義感といいましょうか黙って見ていられなくなり、その方法を模索していたわけです。 個人の情報発信、そのヒット率が大事だということですね。 了解しました。是非参考にさせていただきます。 ありがとうございました。