• 締切済み

8bit(256色)グレースケール画像の保存

32bitのRGB画像ではなく、8bitのグレースケール画像を保存したいと考えています。 保存形式は、tiffとbmpのどちらでも構いません。 ですが、以下のような方法では、 アルファチャンネルを含んだ32bitのRGB画像が保存されてしまいます。 (作成中のプログラムの一例)    Dim img As Bitmap    Dim x As Integer    Dim y As Integer    img = New Bitmap(256, 50)    For x = 0 To 255       For y = 0 To 49          img.SetPixel(x, y, Color.FromArgb(x, x, x))       Next    Next    img.Save("gradation.tif", System.Drawing.Imaging.ImageFormat.Tiff) なお、一例として単純なグラデーション画像を保存していますが、 あくまでも一例であり、グラデーション画像を作成することが目的ではありません。 最終的には、VisualBasicのBitmapクラスで作成したbitmap画像を Photoshopで、8bitのグレースケール画像として開けることが理想です。 どうか、アドバイスをよろしくお願い致しますm(__)m

みんなの回答

回答No.1

ファイル形式には仕様がありますので、まず仕様を確認してはどうでしょうか。 参考:http://www.kk.iij4u.or.jp/~kondo/bmp/ で、仕様どおりにbyte配列を作成して、そのままbyte配列をファイルとして保存すればいいです。 一応BitmapをNewする際にPixelFormatをFormat8bppIndexedと指定できますが、 保存した際は8bit画像ではなく24bitあたりになった記憶があります。確かではないですが。

参考URL:
http://www.kk.iij4u.or.jp/~kondo/bmp/
dogcat1997
質問者

お礼

早速のアドバイス、どうもありがとうございました。 Streamによるファイル操作に苦手意識があり、何となくこの方法を避けていた のですが、避けては通れない道なのでしょうか・・・。 自信はありませんが、挑戦してみます。

関連するQ&A

  • グレイスケール→インデックスカラー→グレイスケール

    わかる人には簡単なことかもしれないんですが、教えてください。 8bitグレイスケールで取った画像を、ファイルに保存するときには1色のインデックスカラーとして保存されています。 これをphotoshopで開いてグレイスケールに戻したときに、最初の取った画像にある階調(pixelごとの明るさ)情報は保たれているのでしょうか??ファイルはTIFFで統一しています。 詳しい状況としては、 顕微鏡で蛍光画像をとるのですが、領域ごとの明るさなどを測定することもあるため、この定量性を失わないようにしたいのです。しかし、デジカメを制御しているソフトが(Photoshopでひらくと)どうしてもインデックスカラーで保存しているようなのです。 周りにきちんと答えられるひとがいないので…

  • photoshopでのbmpのグレースケール保存

    仕事で、複数ある画像をそれぞれ「bmpで630px×630px、解像度400px/inch、グレースケール、8bit」で保存をするように言われました。 私はプロではなく、ちょっとphotoshopが使える程度です。 まずたくさんある画像をすべて同じに揃えるために、 背景レイヤーを作り、630px×630px、イメージでグレースケールモード、8bitチャンネルを選択しました。 そして、上にレイヤーに重ね、画像を貼って大きさ調整し、別名保存でbmpを選択。 そのレイヤーを非表示にして、次のレイヤーを上に重ねて、調節してまた別名保存。 これで頼まれたグループ会社へ画像を渡したのですが、「グレースケールがインデックスカラーになっている」と言われました。 作成したbmp画像を開くと、確かにインデックスカラーになっています。 カラーテーブルはグレースケール、となっていました。 もう一度、そこでイメージ⇒グレースケールにして保存しても、 閉じて開くとまたインデックスカラーに…。 ネット調べてみると、bmpはグレースケールに対応していない、という話もありましたが、 コミックスタジオではbmpでグレースケール保存ができる、というような話もありました。 友人の知人がデザイナーで、聞いてみても、私と同じやり方を言われただけでした。 この画像は、会社のシステムに取り込んで印刷できるようにするためのものなので、 bmpでないとダメなんだと思うのですが、 bmpをグレースケールで保存するにはどうしたらいいのでしょうか。 そちらのグループ会社に頼むと、料金が発生してしまうので、 自分でやろうと思ったのですが…。 バージョンはphotoshopCC、macAirを使っています。 どうか教えてください。よろしくお願いします。

  • 【VB2005】画像の切り出し

    こんばんは。 VB2005で、画像ファイルの一部を切り出し、Image型の変数に格納する方法が分かりません。 (DrawImageメソッドで切り出した画像を描画する事はできました) 【例】 Dim i As Integer Dim sourceImg As Image = Image.FromFile("test.bmp") Dim img(9) As Image For i = 0 To img.Length - 1   img(i) = [sourceImgの一部] Next どなたか、ご教授頂けないでしょうか?

  • グレイスケール画像を透過マスクPNGに変換する方法

    PhotoShop CS5 もしくはフリーソフトで、添付したようなグレイスケールの画像から、PNG形式(RGBA32bit)のアルファチャンネル付き画像に変換する方法を教えて下さい。 グレイスケールの濃度をアルファ値に変換した画像を作成する感じです。 変換後のPNGのRGB値はなんでもいいです。 例:Grayscale 96 → (R,G,B,A) =(0,0,0,96) よろしくお願いします。

  • 256色カラーをグレースケールに変換する軽量・低価格のソフトウェア

    インデックスカラーモードで保存された(実際にはグレースケールの) TIFF画像(複数)をグレースケールに変換でき、かつ、複数画像を一度に 展開できる低価格のソフトウェア(できれば5千円以下)を探しています。 現在はPHOTOSHOPで行っていますが、複数のPCで使用したいので ソフトの単価を抑えたいこと、またソフトの立上げ時間を短縮して 作業効率を上げたいことが理由です。 2,3のシェアウェア(トライアウト版)で試してみたところ、 24bitカラー像のグレースケール変換(保存)はできるのですが、 256色カラー(設定になっているグレースケール画像)では 上手くいきませんでした。 (操作としては上手くいったように見えるが、画像を保存し、 再度開いてみると、インデックスカラーに戻っている。) 画像の展開に関しては、エクスプローラからのドラッグ&ドロップが できれば十分です。(画像の変換、保存は個々に作業する形式でも可) よろしくお願いいたします。

  • カラー画像からグレースケール画像フォーマットの変換

    カラー画像からグレースケール画像フォーマットの変換するプログラムなんですが、いまいち理解できていません。 プログラムはRGB構造体を使ってのものなんですが添削お願いいたします。 #include<stdio.h> #include<stdlib.h> typedef struct _RGB { unsigned char r; unsigned char g; unsigned char b; } RGB; int main(int argc, char *argv[]) { int x, y; unsigned char *in, *out; int i, j, Magic, level; unsigned char tmp[255]; RGB **pixels; int width = 255; int height = 255; int size = width * height; FILE *fin, *fout; if(argc != 3){ printf("Usage : %s input outpu \n", argv[0]); exit(1); } fin = fopen(argv[1], "rb"); fgets(tmp, 255, fin); if(tmp[0] != 'P'){ return 0; } sscanf(tmp, "P%d", &Magic); if(Magic < 1 || Magic > 6){ return 0; } do{ fgets(tmp, 255, fin); } while(tmp[0] == '#'); sscanf(tmp, "%d %d", &x, &y); if(x < 1 || y < 1){ return 0; } fgets(tmp, 255, fin); sscanf(tmp, "%d", &level); printf("P%d\n", &Magic); printf("%d %d\n", x, y); printf("%d\n", level); in = (unsigned char *)malloc(sizeof(unsigned char) *x*y); fread(in, sizeof(unsigned char), x*y, fin); pixels = (RGB**)malloc(width*sizeof(RGB*)); pixels[0] = (RGB* )malloc(size * sizeof(RGB)); for(i = 1; i < width; i++){ pixels[i] = pixels[i - 1] + height; } free(pixels[0]); for(i = 1; i < width * height * 3; i++){ out[i] = pixels[i][0].r * 0.299 + pixels[i][1].g * 0.587 + pixels[i][2].b * 0.114; } fout = fopen(argv[2], "wb"); fprintf(fout,"P%d\n",Magic); fprintf(fout,"# My new PGM\n"); fprintf(fout,"%d %d\n",x, y); fprintf(fout,"%d\n",level); fwrite(out, sizeof(unsigned char),x*y, fout); free(pixels); free(in); free(out); free(fin); free(fout); }

  • 困っています

    読み込んだ画像を白黒判別し、それぞれカウントするプログラムを作ったのですが、上手く機能してくれません。このプログラムについてどなたかわかる方、助言お願いします。間違っている箇所や気づいたこと等、何でもお願いします。 Function CountNumColor(ByRef DotWW As Long, ByRef DotHH As Long, ByRef CHECK_C As Long) As Integer  Dim Form1 As Object Dim NumEQ As Double Dim NumNot As Long Dim x, y As Long NumEQ = 0 NumNot = 0 System.Windows.Forms.Application.DoEvents() For x = 0 To DotHH - 1 For y = 0 To DotWW - 1 System.Windows.Forms.Application.DoEvents() If System.Drawing.Color.BlackToArgb() = Bitmap.GetPixel(x, y).ToArgb() Then NumEQ = NumEQ + 1 Else NumNot = NumNot + 1 Debug.Write("x,y,Val(Bitmap.GetPixel(x, y)") End If Next y Next x CountNumColor = NumEQ End Function

  • 動的に画像を作成し保存するには?

    Visual Basic 2012を使用しています。 下記プログラムを実行するとエラーが表示されてしまいます。 Dim img As New Bitmap(200, 100) Dim g As Graphics = Graphics.FromImage(img) g.FillRectangle(Brushes.Black, g.VisibleClipBounds) g.Dispose() PictureBox1.Image = img img.Save("E:\EPUB_test\test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg) img.Dispose() 表示されるエラーは下記です。 型 'System.ArgumentException' のハンドルされていない例外が System.Drawing.dll で発生しました どこが間違っているのでしょうか? 正しく動作させるにはどこを修正すべきかをお教え下さい。

  • FLASHとPHPの連携について

    プログラミング初心者です。 いまポストカード作成システムを大学の課題で作っています。 環境はWindowsXP FLASH8Proです。 最後の保存するところで詰まっています。 現時点でできているところまでHPにアップしたので載せます。 ​http://www.geocities.co.jp/ysmnh028/otameshi.html​ URLより画像を読み込み最後に保存をしたくていろいろ調べていて、PHPと連携させてブラウザ上に新しいページで画像を生成し、それを右クリック⇒保存という形で保存できる事はわかりました。 SAVEボタンのASは以下のとおりです。 on (press) { // 保存用Bitmapを生成 var bmpSnap = new flash.display.BitmapData(300, 444, false); // 保存したいMovieClipをBitmapに描画する bmpSnap.draw(_root.photo_mc); // BitmapデータをRGB配列にする var img_data = new Array(); for (var x = 0; x<bmpSnap.width; x++) { for (var y = 0; y<bmpSnap.height; y++) { var col = bmpSnap.getPixel(x, y); img_data.push(("000000"+col.toString(16)).substr(-6, 6)); } } // データを送信 System.useCodepage = true; myLoader = new LoadVars(); myLoader.img_width = bmpSnap.width; // 画像幅 myLoader.img_height = bmpSnap.height; // 画像高さ myLoader.img_data = img_data.join(""); // 画像データ myLoader.send("snapshot.php", "_blank", "POST"); } PHP側は <?php // 送信データを取得 $img_data = $_POST['img_data']; $width = $_POST['img_width']; $height = $_POST['img_height']; $type = $_POST['img_type']; // IMAGE生成 $source_img = imagecreatetruecolor ($width, $height); // 背景色を生成 $bg_col = imagecolorallocate($source_img, 0xFF, 0xFF, 0xFF); $border_col = imagecolorallocate($source_img, 0x00, 0x00, 0x00); // イメージを描画 $p = 0; for ($x = 0; $x < $width ; $x++) { for ($y = 0; $y < $height ; $y++) { $rgb = hexdec(substr($img_data, $p, 6)); $p+=6; $r = ($rgb >> 16) & 0xFF; $g = ($rgb >> 8) & 0xFF; $b = $rgb & 0xFF; $col = imagecolorallocate($source_img, $r, $g, $b); imagesetpixel($source_img, $x, $y, $col); } } header("Content-Type: image/jpeg"); imagejpeg($source_img); exit; // JPEG出力 touch("test.jpg"); // まずは空ファイル生成 imagejpeg($source_img, "test.jpg"); // 画像を保存 header("Content-Type: image/jpeg"); readfile('test.jpg'); exit; ?> 以上です。 ローカルでためしたところ画像は表示されず、かわりに代替画像としてアドレスが表示されます。 考えられる原因はなんでしょうか?? よろしくお願いします。

    • 締切済み
    • PHP
  • 簡単法知ってる人教えてください。

    ボタンを押して画像を読み込み、その画像をカウントするプログラムを考えたのですが、画像の絶対パスを取得するために毎回変更する部分ができてしまいました;; 誰か、どんな画像でも読み込める工夫を知ってる人がいたら教えてください。プログラムは↓ Function CountNumColor(ByRef DotWW As Long, ByRef DotHH As Long, ByRef CHECK_C As Long) As Integer Dim Form1 As Object Dim NumEQ As Double Dim NumNot As Long Dim x, y As Long Dim ChkColor As Color = Color.FromArgb(0) Dim myBitmap As New Bitmap("E:\2005\画像処理システム\無題.bmp") NumEQ = 0 NumNot = 0 System.Windows.Forms.Application.DoEvents() For x = 0 To DotHH - 1 For y = 0 To DotWW - 1 System.Windows.Forms.Application.DoEvents() ChkColor = myBitmap.GetPixel(x, y) If ChkColor.R = 0 And ChkColor.G = 0 And ChkColor.B = 0 Then NumEQ = NumEQ + 1 Else NumNot = NumNot + 1 Debug.Write("x,y,Val(Bitmap.GetPixel(x, y)") End If Next y Next x CountNumColor = NumEQ End Function このプログラムの”E:\2005\画像処理システム\無題.bmp”の部分を工夫してどんな画像でも読み込むことができることができるようにできないでしょうか? わかる人の知恵を貸してください><