- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
基于@ben75 提出的这个问题:Android : save a Bitmap to bmp file format
我现在的问题是:如何获得每像素 1 位深度的 BMP 图像(黑白)?
最佳答案
回答我自己的问题...
在整个网络上进行了一番艰难的搜索后,我意识到我必须创建 2 个东西:黑白位图 - 并使用将低于 128 的颜色全为 0,其余颜色全为 255 的方法来做到这一点,就像这样(这是 C# 代码,因为我正在使用 Xamarin 编写我的应用程序代码):
private void ConvertArgbToOneColor (Bitmap bmpOriginal, int width, int height){
int pixel;
int k = 0;
int B=0,G=0,R=0;
try{
for(int x = 0; x < height; x++) {
for(int y = 0; y < width; y++, k++) {
pixel = bmpOriginal.GetPixel(y, x);
R = Color.GetRedComponent(pixel);
G = Color.GetGreenComponent(pixel);
B = Color.GetBlueComponent(pixel);
R = G = B = (int)(0.299 * R + 0.587 * G + 0.114 * B);
if (R < 128) {
m_imageArray[k] = 0;
} else {
m_imageArray[k] = 1;
}
}
if(m_dataWidth>width){
for(int p=width;p<m_dataWidth;p++,k++){
m_imageArray[k]=1;
}
}
}
}catch (Exception e) {
System.Console.WriteLine ("Converting to grayscale ex: " + e.Message);
}
}
然后获取单色图片的byteArray:
int length = 0;
for (int i = 0; i < m_imageArray.Length; i = i + 8) {
byte first = m_imageArray[i];
for (int j = 0; j < 7; j++) {
byte second = (byte) ((first << 1) | m_imageArray[i + j]);
first = second;
}
m_rawImage[length] = first;
length++;
}
最后使用以下变量“手动”创建位图并将它们放入 FileOutputStream 以保存文件:
private static int FILE_HEADER_SIZE = 14;
private static int INFO_HEADER_SIZE = 40;
// Bitmap file header
private byte[] bfType = { (byte) 'B', (byte) 'M' };
private int bfSize = 0;
private int bfReserved1 = 0;
private int bfReserved2 = 0;
private int bfOffBits = FILE_HEADER_SIZE + INFO_HEADER_SIZE + 8;
// Bitmap info header
private int biSize = INFO_HEADER_SIZE;
private int biWidth = 0;
private int biHeight = 0;
private int biPlanes = 1;
private int biBitCount = 1;
private int biCompression = 0;
private int biSizeImage = 0;
private int biXPelsPerMeter = 0x0;
private int biYPelsPerMeter = 0x0;
private int biClrUsed = 2;
private int biClrImportant = 2;
// Bitmap raw data
private byte[] bitmap;
// Scanlinsize;
int scanLineSize = 0;
// Color Pallette to be used for pixels.
private byte[] colorPalette = { 0, 0, 0, (byte) 255, (byte) 255,
(byte) 255, (byte) 255, (byte) 255 };
关于Android:将Bitmap对象保存为bmp(1bpp)文件格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25447886/
我的 Android 应用程序使用外部库来进行一些图像处理。处理链的最终输出是单色位图,但保存的是彩色位图(32bpp)。 图像必须上传到云 blob,因此出于带宽问题,我想将其转换为 1bpp G4
图像处理开始工作时会很有趣。到目前为止,我能够将 24 bpp 位图图像转换为 8 bpp 并执行一些技巧。 但我无法将它们更改为 1 bpp,这正是我想要的。我在 .Net4 上工作,我使用一个名为
我们有一个采用 32 bpp 数据的编码器库。我们有一个屏幕捕获库,它也需要支持 16 bpp。每当我需要将新的屏幕截图传递给编码器时,我想将 16bpp 的原始数据转换为 32bpp。如何有效地完成
首先,我在内核上下文中编程,因此不存在现有库。事实上,这段代码将进入我自己的库。 两个问题,一个比另一个重要: 如标题所示,假设我有帧缓冲区的地址,我如何才能有效地将 24-bpp 图像渲染到 32-
我有一张图像,即使用 Windows GDI 调用 (24 bpp) 绘制的图像,我需要将此图像转换为 16 bpp。这是在 Windows Mobile 上。 24 bpp - RGB (rrrr
谁能告诉我如何将 1BPP 、 4BPP 和 8BPP 保存为位图。我在图像中有位,宽度和高度。 请告诉我如何将其保存为位图。 最佳答案 对于 Windows 和 C++,最简单的方法是 Gdiplu
我需要拍摄全彩色 JPG 图像并将其颜色重新映射到索引调色板。调色板将包含从数据库中填充的特定颜色。我需要将图像的每种颜色映射到索引中它的“最接近”值。我确信有不同的算法来比较和计算“最接近”的值。仅
我的程序当前采用 4 bpp(每像素位)TIFF 作为位图,将其转换为图形,添加一些文本字符串,然后再次将其保存为 TIFF 文件。默认情况下,输出 Bitmap.Save() TIFF 文件似乎是
我使用 xlib XGetImage 捕获图像并将其保存到位图,问题是位图是 32 BPP,我必须将该位图转换为 24 BPP,有什么想法吗?也许使 XGetImage 获得 24 BPP 图像或将
我有一个 C++ MFC 项目,我需要在其中翻转可以采用不同格式的位图,然后保存它。我在制作以多种格式保存位图的功能时遇到问题。 当我尝试启用 ATL(Active Template Libraray
每次我运行我的应用程序时颜色都会改变,显示如下 Display = SDL_SetVideoMode(WIDTH, HEIGHT, 16, SDL_HWSURFACE | SDL_DOUBLEBUF
几天以来,我一直在使用 FO-DICOM 处理 DICOM 文件。 我正在使用一组 dicom 文件进行测试,并且我一直在打印“光度解释”和“每像素样本”值,以便更好地了解我正在处理的图像类型。 结果
我正在尝试编写一个 GStreamer (0.10.34) 插件。我需要操纵传入的图像。我将 Sink cap 设置为“video/x-raw-yuv”,这样我就知道我会收到视频。 我无法理解如何使用
在以下情况下我找不到解释像素数组的方法:我在 Windows 7 上使用 MS Paint 创建了一个 2x2 像素的 BMP 图像。将其保存为单色 BMP(我认为这意味着颜色深度为每像素 1 位的
我正在研究一种算法来优化盒子中元素的包装。 我最多可以容纳 20 件元素,需要将它们装在尽可能少的盒子中(6 种可能的盒子尺寸),同时最大限度地减少盒子内浪费的体积。我想过实现 3D BPP 算法的变
我有一张签名图像,我想将其另存为 1 bpp 位图以节省文件空间。完整的 .NET Framework 具有枚举 PixelFormat.Format1bppIndexed,但 .NET Compac
使用 Magick.NET-Q8-AnyCPU。我想将现有 TIFF 图像转换为灰度 8 bpp BMP 图像。我试过这个: byte[] input = ; using (var image = n
我需要在 C++ 程序中打开 16 bpp 灰度 tiff 图像。尝试使用 GDI+ Image 类执行此操作时,我得到 OutOfMemoryException(GDI+ 不支持 16 bpp 格式
我正在尝试将 8-bpp 索引位图转换为 RGB 位图,但我没有成功。 第一个问题是 GetPalette() 返回的调色板不包含 256 个唯一数字。 到目前为止,这是我的代码: BitmapDat
我正在使用 AVCaptureSession 从 iPhone 的前置摄像头捕获帧。我正在尝试更改 AVCaptureVideoDataOutput 的格式,以便它可以捕获 24 bpp 位图。此代码
我是一名优秀的程序员,十分优秀!