Bitmap类

封装 GDI+ 位图,此位图由图像及其属性的像素数据组成。 Bitmap 是用于处理由像素数据定义的图像的对象。

[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public sealed class Bitmap : System.Drawing.Image

可以看出来,它继承于System.Drawing.Image 类,所以可以直接赋值给Image对象,因为派生类对象可以用基类引用

private Bitmap image1;//定义一个Bitmap对象

private void Button1_Click(System.Object sender, System.EventArgs e)
{

    try
    {
        // Retrieve the image.
        image1 = new Bitmap(@"C:\Documents and Settings\All Users\" 
            + @"Documents\My Music\music.bmp", true);

        int x, y;

        // Loop through the images pixels to reset color.
        for(x=0; x<image1.Width; x++)
        {
            for(y=0; y<image1.Height; y++)
            {
                Color pixelColor = image1.GetPixel(x, y);
                Color newColor = Color.FromArgb(pixelColor.R, 0, 0);
                image1.SetPixel(x, y, newColor);
            }
        }

        // Set the PictureBox to display the image.
        PictureBox1.Image = image1;//直接将Bitmap赋值给PictureBox的Image属性

    }
    catch(ArgumentException)
    {
        MessageBox.Show("There was an error." +
            "Check the path to the image file.");
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果不使用 `Bitmap` ,可以使用 Windows 提供的 GDI(图形设备接口)库来操作 BMP 图片。下面是一个简单的示例代码,演示了如何使用 GDI 库实现 BMP 图片的 RLE 压缩和解压缩: ```cpp #include <windows.h> // 压缩 BMP 图片 bool CompressBmp(LPCTSTR lpszSrcFile, LPCTSTR lpszDstFile) { // 打开 BMP 文件 HANDLE hFile = CreateFile(lpszSrcFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { return false; } // 读取 BMP 文件头 BITMAPFILEHEADER bmfHeader; DWORD dwBytesRead; if (!ReadFile(hFile, &bmfHeader, sizeof(BITMAPFILEHEADER), &dwBytesRead, NULL) || dwBytesRead != sizeof(BITMAPFILEHEADER)) { CloseHandle(hFile); return false; } // 读取 BMP 位图信息头 BITMAPINFOHEADER bmiHeader; if (!ReadFile(hFile, &bmiHeader, sizeof(BITMAPINFOHEADER), &dwBytesRead, NULL) || dwBytesRead != sizeof(BITMAPINFOHEADER)) { CloseHandle(hFile); return false; } // 计算行字节数 int nBytesPerLine = (bmiHeader.biWidth * bmiHeader.biBitCount + 7) / 8; nBytesPerLine = (nBytesPerLine + 3) / 4 * 4; // 计算压缩后的 BMP 数据区大小 DWORD dwCompressedSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (nBytesPerLine * bmiHeader.biHeight + bmiHeader.biHeight) / 2; // 分配压缩后的 BMP 数据区 BYTE* pCompressedData = new BYTE[dwCompressedSize]; memset(pCompressedData, 0, dwCompressedSize); // 填充压缩后的 BMP 文件头 BITMAPFILEHEADER bmfCompressedHeader; bmfCompressedHeader.bfType = 0x4d42; bmfCompressedHeader.bfSize = dwCompressedSize; bmfCompressedHeader.bfReserved1 = 0; bmfCompressedHeader.bfReserved2 = 0; bmfCompressedHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); // 填充压缩后的 BMP 位图信息头 BITMAPINFOHEADER bmiCompressedHeader; bmiCompressedHeader.biSize = sizeof(BITMAPINFOHEADER); bmiCompressedHeader.biWidth = bmiHeader.biWidth; bmiCompressedHeader.biHeight = bmiHeader.biHeight; bmiCompressedHeader.biPlanes = 1; bmiCompressedHeader.biBitCount = bmiHeader.biBitCount; bmiCompressedHeader.biCompression = BI_RLE4; bmiCompressedHeader.biSizeImage = 0; bmiCompressedHeader.biXPelsPerMeter = 0; bmiCompressedHeader.biYPelsPerMeter = 0; bmiCompressedHeader.biClrUsed = 0; bmiCompressedHeader.biClrImportant = 0; // 填充压缩后的 BMP 数据 memcpy(pCompressedData, &bmfCompressedHeader, sizeof(BITMAPFILEHEADER)); memcpy(pCompressedData + sizeof(BITMAPFILEHEADER), &bmiCompressedHeader, sizeof(BITMAPINFOHEADER)); BYTE* pCompressedLineData = pCompressedData + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); BYTE* pLineData = new BYTE[nBytesPerLine]; for (int i = 0; i < bmiHeader.biHeight; i++) { // 读取一行 BMP 数据 if (!ReadFile(hFile, pLineData, nBytesPerLine, &dwBytesRead, NULL) || dwBytesRead != nBytesPerLine) { delete[] pLineData; delete[] pCompressedData; CloseHandle(hFile); return false; } // 压缩一行 BMP 数据 int nCompressedLineSize = nBytesPerLine; int nCompressedLineOffset = 0; while (nCompressedLineOffset < nCompressedLineSize) { int nRunLength = 1; BYTE bCode = 0x00; // 计算重复值或非重复值的数量 while (nCompressedLineOffset + nRunLength < nCompressedLineSize && nRunLength <= 0x0f) { if (pLineData[nCompressedLineOffset + nRunLength] == pLineData[nCompressedLineOffset]) { bCode = 0x00; nRunLength++; } else { bCode = 0x01; break; } } // 写入非重复值的编码和数据 if (bCode == 0x01) { *pCompressedLineData++ = (BYTE)(nRunLength | 0x80); for (int j = 0; j < nRunLength; j++) { *pCompressedLineData++ = pLineData[nCompressedLineOffset + j]; } } // 写入重复值的编码和数据 else { *pCompressedLineData++ = (BYTE)(nRunLength - 1); *pCompressedLineData++ = pLineData[nCompressedLineOffset]; } nCompressedLineOffset += nRunLength; } // 写入行结束标志 *pCompressedLineData++ = 0x00; *pCompressedLineData++ = 0x00; } // 保存压缩后的 BMP 图片 DWORD dwBytesWritten; SetFilePointer(hFile, 0, NULL, FILE_BEGIN); WriteFile(hFile, pCompressedData, dwCompressedSize, &dwBytesWritten, NULL); CloseHandle(hFile); delete[] pLineData; delete[] pCompressedData; return true; } // 解压缩 BMP 图片 bool DecompressBmp(LPCTSTR lpszSrcFile, LPCTSTR lpszDstFile) { // 打开 BMP 文件 HANDLE hFile = CreateFile(lpszSrcFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { return false; } // 读取 BMP 文件头 BITMAPFILEHEADER bmfHeader; DWORD dwBytesRead; if (!ReadFile(hFile, &bmfHeader, sizeof(BITMAPFILEHEADER), &dwBytesRead, NULL) || dwBytesRead != sizeof(BITMAPFILEHEADER)) { CloseHandle(hFile); return false; } // 读取 BMP 位图信息头 BITMAPINFOHEADER bmiHeader; if (!ReadFile(hFile, &bmiHeader, sizeof(BITMAPINFOHEADER), &dwBytesRead, NULL) || dwBytesRead != sizeof(BITMAPINFOHEADER)) { CloseHandle(hFile); return false; } // 计算行字节数 int nBytesPerLine = (bmiHeader.biWidth * bmiHeader.biBitCount + 7) / 8; nBytesPerLine = (nBytesPerLine + 3) / 4 * 4; // 计算解压缩后的 BMP 数据区大小 DWORD dwUncompressedSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nBytesPerLine * bmiHeader.biHeight; // 分配解压缩后的 BMP 数据区 BYTE* pUncompressedData = new BYTE[dwUncompressedSize]; memset(pUncompressedData, 0, dwUncompressedSize); // 填充解压缩后的 BMP 文件头 BITMAPFILEHEADER bmfUncompressedHeader; bmfUncompressedHeader.bfType = 0x4d42; bmfUncompressedHeader.bfSize = dwUncompressedSize; bmfUncompressedHeader.bfReserved1 = 0; bmfUncompressedHeader.bfReserved2 = 0; bmfUncompressedHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); // 填充解压缩后的 BMP 位图信息头 BITMAPINFOHEADER bmiUncompressedHeader; bmiUncompressedHeader.biSize = sizeof(BITMAPINFOHEADER); bmiUncompressedHeader.biWidth = bmiHeader.biWidth; bmiUncompressedHeader.biHeight = bmiHeader.biHeight; bmiUncompressedHeader.biPlanes
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值