我有一个C语言源代码,用于嵌入式系统,包含每像素8位灰度图像的数据数组。我负责记录软件,我想将此源代码转换为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;
以下是我的问题:(是的,复数)
我可以使用以下资源:MS Visio 2010,Gimp,Paint,Java,Eclipse,MS Visual Studio 2010 Professional,wxWidgets,wxFrameBuilder,Cygwin。
我可以用C#,Java,C或C ++编写自定义应用程序。
感谢您的建议。
答案 0 :(得分:2)
使用java的问题是将字节设为int。在阅读时,您需要转换为int才能捕获值> 127因为java没有无符号字节。
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);
答案 1 :(得分:1)
我可以回答问题4,我可以在c#中为您提供代码。这很简单......
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;
答案 2 :(得分:0)
您可以在java中使用ImageIO类。
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GREY);
Graphics2D g2 = bi.createGraphics();
//loop through and draw the pixels here
File out = new File("Myimage.jpg");
ImageIO.write(bi, "jpg", out);