2011-08-16 11 views
6

埋め込みシステム用のC言語ソースコードは、8ビット/ピクセルグレースケールイメージ用のデータ配列を含んでいます。私はソフトウェアの文書化を担当しています。このソースコードをJPEG(画像)ファイルに変換したいと思います。ここで生のグレースケールバイナリをJPEGに変換する

は、コードサンプルです:ここで

const unsigned char grayscale_image[] = { 
0, 0, 0, 0, 0, 0, 0, 74, 106, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 
159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 146, 93, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
//... 
}; 
const unsigned int height = 41; 
const unsigned int width = 20; 

は私の質問は以下のとおりです(はい、複数)あなたはJPEGに、このソースファイルを変換するための

  1. 何アプリケーション(複数可)をお勧めですか?
  2. GIMPまたはペイントでデータのCSVファイルをインポートできますか?
  3. このカスタムアプリケーションを作成した場合、 JPEGのJavaライブラリは何ですか?
  4. このタスクを達成するためにどのライブラリがC#に存在しますか?

次のリソースを自由に使用できます:MS Visio 2010、Gimp、Paint、Java、Eclipse、MS Visual Studio 2010 Professional、wxWidgets、wxFrameBuilder、Cygwin。
私はカスタムアプリケーションをC#、Java、CまたはC++で記述することができます。

ご協力いただきありがとうございます。

+1

このような小さな画像には、JPEGではなくPNGを使用することを検討してください。 –

+1

私は@Michaelに同意します。これはjpegよりもpngのようなロスレスなフォーマットに適しています。画像は小さくて鋭いエッジを持っているため、jng以上のpng/gifにフィットします。 Jpegは鋭いエッジではうまく対処しません。 – CodesInChaos

答えて

1

Javaを使用する際の問題は、バイトをintとして取得することです。 javaが符号なしバイトを持たないため、読み込み中に値> 127を取得するためにintに変換する必要があります。

int height=41; 
int width=20; 
int[] data = {...}; 

BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); 
for (int x = 0; x < width; x++) { 
    for (int y = 0; y < height; y++) { 
    // fix this based on your rastering order 
    final int c = data[ y * width + x ]; 
    // all of the components set to the same will be gray 
    bi.setRGB(x,y,new Color(c,c,c).getRGB()); 
    } 
} 
File out = new File("image.jpg"); 
ImageIO.write(bi, "jpg", out); 
0

javaでImageIOクラスを使用できます。

+0

これは機能しますか?それはどのように高さと幅を知るでしょうか? – musefan

+0

@musefanグレイスケール画像を読み込み、それがメタデータを持つ画像バイト配列であると仮定しました。 – Andrew

+0

私は、幅と高さが別々に供給されたためにメタデータを含まないと仮定しました。また、JPegファイル形式は0xFF 0xD8で始まります...これは、このポストのためのダミーデータである可能性があるため、OPがクリアするためのものかもしれません。 – musefan

1

私は質問4に答えることができ、これをC#で行うコードを与えることができます。ビットと代替:それはあなたが(たとえば、ビットマップメモリ​​をロックするなど)、ビットマップ最適化技術

EDITの周りを見ればあなたも、このコードを最適化することができるかもしれ...

int width = 20, height = 41; 
byte[] grayscale_image = {0, 0, 0, ...}; 
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(width, height); 
int x = 0; 
int y = 0; 
foreach (int i in grayscale_image) 
{ 
    bitmap.SetPixel(x, y, System.Drawing.Color.FromArgb(i, i, i)); 
    x++; 
    if (x >= 41) 
    { 
     x = 0; 
     y++; 
    } 
} 
bitmap.Save("output.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); 

非常に簡単です(もっと速くする必要があります)

注:Bitmapオブジェクトの作成時に使用されるPixelFormatについて100%確信はありません。

int width = 20, height = 41; 
byte[] grayscale_image = {0, 0, 0, ...}; 
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(width, height, PixelFormat.Format8bppIndexed); 

System.Drawing.Imaging.BitmapData bmpData = bitmap.LockBits(
        new Rectangle(0, 0, bitmap.Width, bitmap.Height), 
        ImageLockMode.WriteOnly, bitmap.PixelFormat); 

System.Runtime.InteropServices.Marshal.Copy(bytes, 0, bmpData.Scan0, bytes.Length); 

bitmap.UnlockBits(bmpData); 

return bitmap; 
+0

ありがとうございます。アプリケーションがPC上で実行されるため、パフォーマンス基準はありません。 –

+0

これは「コンソール」アプリケーションですか、GUIが必要ですか? –

+1

@Thomasそれはコンソールアプリケーションにすることができますが、 'System.Drawing.dll'への参照を追加する必要があります。 – CodesInChaos

関連する問題