精华内容
下载资源
问答
  • 2021-04-18 07:34:53

    将srcimg文件下的bmp文件转为jpg图像,存放在dstimg文件夹下 str = 'srcimg'; dst = 'dstimg'; file=dir([str,'\*.bmp']); :length(file) img = imread( [str,'\',file(i).name]); imwrite(img, [dst,'\',file(i).name(1:end-4),'.jpg']); end…

    public class FTPUtils { private static final Logger LOG = LoggerFactory.getLogger(FTPUtils.class); /** * 获取FTPClient对象 * * @param ftpHost FTP主机服务器 * @param ftpPassword FTP 登录密码 * @param ftpUserName FTP登录用户名 * @param ftpPort FTP端口 默认为21 * @return */ p…

    File 递归删除文件夹中所有文件文件夹 package com.swift.kuozhan; import java.io.File; import java.util.Scanner; /*键盘录入一个文件夹路径,删除该路径下的所有文件文件夹,包括自己. 要求:文件夹中包含有子文件夹*/ public class TheLat { public static void main(String[] args) { File dir = inputDir(); delete(dir); } pr…

    package com.readme; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; /** * @author lisj * 用字符流实现每个文件夹中创建包含所有…

    说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到的文件是否属于指定类型,如果是,则将在该文件中查找指定字符串. 在文件中查找字符串时,开辟一个与指定字符串 text (长度为len )同样大小的字符串数组 temp .数组上有两个指针:一个是字符串比较的开始位置 s ,一个是新字符写入的位置 d .每从文件中读入一个字符,就写入 temp[d] …

    rm  删除文件夹中大量的小文件 百万 迟迟未删除 在扫描文件? rm删除命令源码分析 - ty_laurel的博客 - CSDN博客 https://blog.csdn.net/ty_laurel/article/details/51014650 [root@d mongoexport]# zip -rv QA_test .Scanning files ..................................…

    前段时间做项目需要读取一个文件夹里面所有的txt文件,查询资料后得到以下实现方法:首先了解一下这个结构体struct _finddata_t {    unsigned    attrib;    time_t      time_create;       time_t      time_access;       time_t      time_write;    _fsize_t    size;    char        name[260];};其中各成员变量的含义如下:unsi…

    shell脚本能帮我们简化linux下的一些工作,现在有个需求,把TMPA文件夹下大于2000B的文件都移动到TMPB下 #! /bin/bash function movefiles() { ` do ] then mv $"/"$file fi done } movefiles "/home/jimmyxu/TMPA" "/home/jimmyxu/TMPB" 脚本很简单,使用for循环遍历第一个输入路径下的文件,使用stat获取文件的属性值…

    ].Items.Clear(); string filePath = Application.StartupPath; string sourcePath = Path.Combine(filePath, "reports"); string sourcePathXml = Path.Combine(sourcePath, "XuHang"); string targetPath = ReportTemplate.ReportTemplateDirectory; C…

    当前文件夹下有一些文件和文件夹,当中每一个文件夹里都有若干.txt文件. 如今要求在当前文件夹创建一个新文件夹all,且将那些文件夹全部.txt文件 都复制到文件夹all.在ubuntu12.04的shell脚本实现例如以下: #!/bin/sh # 提示信息 echo "start:" # 定义变量 dst=all pst=.txt # 拷贝文件到目标目录 if [ -d ${dst} ] then echo "${dst} existed" else echo…

    现在有一个文件夹,里面有很多子文件夹,每个子文件夹中有很多不同类型的图片,现在想将其所有.png图片整理出来,一开始我是手动拷贝的,拷贝了几个图片后,突然想能不能让计算机来自动完成此项功能,经过一番尝试,确实可以. 首先看一下目录结构: pushd C:\2015_VSIcon for /r %%a in (*.png) do ( XCOPY /Y "%%a" "C:\vs2015png" ) popd 我这里是win10操作系统,将其保存为.bat文件,然后用管理…

    1.说明 使用Directory类对指定文件夹下的今天或者更早日期之前的文件进行删除.原文链接:http://www.cnblogs.com/lengzhan/p/6423943.html 2.代码 //文件夹路径 string strFolderPath = Server.MapPath("~") + "\\excel\\"; DirectoryInfo dyInfo = new DirectoryInfo(strFolderPath); //获取文件夹下所有的文…

    @echo off del f:Thumbs.db /f/s/q/a exit 对应修改磁盘号, 保存批处理文件执行即可…

    MATLAB需要读取一个文件夹下的多个子文件夹中的指定格式文件,这里以读取*.JPG格式的文件为例 1.首先确定包含多个子文件夹的总文件夹 maindir = 'C:\Temp Folder'; 2.再确定有哪些子文件夹,并过滤掉干扰的文件 subdir = dir( maindir ); % 确定子文件夹 : length( subdir ) if( isequal( subdir( i ).name, '.' ) || isequal( subdir( i ).name, '..' ) ||…

    1. activity_main.xml文件

    发现在ubuntu和centos中有些命令还不一样,比如<<

    博主在使用Code::Blocks创建一个工程之后,正准备新建一个头文件,细心的博主发现,在工程文件夹中有两个子文件夹,分别是bin和obj.好奇心驱使下,想知道这两个文件夹用来干嘛的,网上搜了下,整合如下: 首先bin是binary(二进制)的简写,obj是object(推测翻译成对象)的简写.bin中存放着本工程生成的结果文件,可理解为可执行文件(.exe):obj中存放着分块编译的中间文件,之所以是分块的,推断是用于加快下次的编译,只修改有变动的块. 除此之外,在bin和obj中还分别有两…

    先用命令行,进入你要删除的文件夹中(./ 为这个文件夹的当前路径,也可以填写绝对路径) 命令行下输入: sudo find ./ -name ".svn" -exec rm -r {} \; 查看,所有的.svn 都已删除 显示隐藏文件,我可以通过“终端”,用命令行设置这个选项,命令如下:显示:defaults write com.apple.finder AppleShowAllFiles -bool true隐藏:defaults write com.apple.finder Ap…

    参考:http://blog.csdn.net/guoxiaojie_415/article/details/21317323:http://blog.csdn.net/qikaihuting/article/details/70244416:http://blog.csdn.net/qq_18343569/article/details/50960254 本篇博文仅针对于循环读取指定文件夹下的图片文件,不涉及深度和层度遍历,但是本文循环读取的方式是以深度遍历为基础的,涉及到isdir函数,如果…

    由于经常有读取一个文件夹中的很多随机编号的文件,很多时候需要读取某些特定格式的所有文件. 下面的代码可以读取指定文件家中的所有文件和文件夹中格式为jpg的文件 参考: http://www.2cto.com/kf/201407/316515.html http://bbs.csdn.net/topics/390124159 //windows 获取某个目录下的所有文件的文件名#include #include #include

    读取同一文件夹下多个txt文件中的特定内容并做统计 有网友在问,C#读取同一文件夹下多个txt文件中的特定内容,并把各个文本的数据做统计. 昨晚Insus.NET抽上些少时间,来实现此问题,加强自身的功力.先是准备好几个文本文件.第一个文本文件t1.txt:   Money of Xiaohong(this year) 12 Money of Xiaoma(Last year) 13 sdfgsd Money of Xiaoqiang(this year) 16 Money of Xiaogan…

    python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 python操作txt文件中数据教程[1]-使用python读写txt文件 python操作txt文件中数据教程[2]-python提取txt文件 原始txt文件 程序实现后结果 程序实现 import csv import os SUM_LOG_FILE = [] # sum_csv文件名 INDIVIDUAL_LOG_FI…

    解决的问题:需要读取某个大文件夹下所有子文件夹中的excel文件,并汇总,汇总文件中需要包含的2部分的信息:1.该条数据来源于哪个子文件夹:2.该条数据来源于哪个excel文件.最终,按照子文件夹单独保存汇总文件,或者只保存成一个汇总文件. 场景描述:抓取了各个APP的使用数据,分散地保存在各个文件夹中.文件格式如下: 第一级分类:文件夹名 第二级分类:文件夹下xlsx文件名 第三级分类:每个xlsx文件中每行(具体的每条数据),但其中并没有该APP属于的二级分类和一级分类,需要为每条数据添加二…

    本实例的目的在于: 1 了解怎样遍历指定文件夹中的全部文件 2 控制台怎样输入和输出数据 代码: using System; using System.IO; namespace ToSql{ class ToSql{ static void Main(){ string path = System.Environment.CurrentDirectory; System.Console.WriteLine("输入要读取的文件夹名"); string name = Console.Re…

    更多相关内容
  • 数字图像处理(一)——BMP图像的介绍和读取

    千次阅读 多人点赞 2020-03-03 10:34:35
    C(C++)语言实现BMP图像的读取,BMP图像的读取,BMP图像的介绍,数字图像处理,C(C++)语言读取BMP图像的像素值。

      数字图像处理的代码在网上已经非常普遍了,但是大部分文章中的代码都是针对某一个功能的,而且实现功能的编程语言种类非常多,这在小贾学习的过程中造成了很多的麻烦。所以小贾打算写几篇的文章来总结小贾在入门时候遇到的“坑”。如果您只想参考图像处理过程中的代码,您可以直接跳到文章的代码部分。小贾在代码中也会有代码的详细注释。当然,如果您刚刚入坑,小贾也会在文章中附加一些段落来帮你理解图像处理。

    1. 写在前面

    1.1. 先放一张图

    Lena.bmp
      熟悉图像处理的人一定认识这张图像。因为他们在实验或者项目任务中经常使用Lena图像。Lena图像已经成为被广泛使用的测试图像。今天,Lena图像的使用被认为是数字图像历史上最重要的事件之一1。如果你刚开始接触图像处理,那么恭喜你以后要经常见到这个图像了。

    1.2. 再说一种图像格式

      说完了上面的图片,那么接下来再了解一种图像格式:BMP。
      BMP是英文Bitmap(位图)的缩写,它是Windows操作系统中的标准图像文件格式2,其能够被多种Windows应用程序所支持。这种格式的特点是包含的图像信息比较丰富,几乎不进行压缩,但由此导致了它与生俱来的缺点——占用空间过大。

    1.3. 接着介绍一个头文件

      随着Windows的逐渐普及,支持BMP图像格式的应用软件越来越多。这主要是因为Windows把BMP作为图像的标准格式,并且内含了一套支持BMP图像处理的API函数。在C(C++)语言编程中,这套API函数的存在是以Windows.h头文件存在于系统中。在用C(C++)语言3编程实现图像处理的时候我们我们需要在代码最前端引用Windows.h头文件。
      Windows.h头文件中包含了windef.h、winnt.h、winbase.h、winuser.h、wingdi.h等头文件,涉及到了Windows内核API,图形界面接口,图形设备函数等重要的功能。

    2. BMP文件格式

      BMP文件格式4可分为文件信息头、位图信息和位图数据三部分。

    2.1. 文件信息头

      BMP文件头含有BMP文件的类型、大小和存放位置等信息。Windows.h中对其定义为:

    typedef struct tagBITMAPFILEHEADER{
    	WORD bftype; // 位图文件的类型,必须设置为BM
    	DWORD bfSize; // 位图文件的大小,以字节为单位
    	WORD bfReserved1; // 位图文件保留字,必须设置为0
    	WORD bfReserved2; // 位图文件保留字,必须设置为0
    	DWORD bfoffBits; // 位图数据相对于位图文件头的偏移量表示
    } BITMAPFILEHEADER;
    
    2.2. 位图信息

      位图信息用BITMAPINFO结构定义,它是由位图信息头(bitmap-information header)和彩色表(color table)组成,位图信息头用BITMAPINFOHEADER结构定义,彩色表用RGBQUAD结构定义。BITMAPINFO结构具有如下形式:

    typedef struct tagBITMAPINFO{
    	BITMAPINFOHEADER bmiHeader;
    	RGBQUAD bmiColor[];
    } BITMAPINFO;
    

      (1)bmiHeader是一个位图信息头(BITMAPINFOHEADER)类型的数据类型,用于说明位图的尺寸。BITMAPINFOHEADER的定义如下:

    typedef struct tagBITMAPINFOHEADER{
    	DWORD biSize; // bmiHeader结构的高度
    	DWORD biWidth; // 位图的宽度,以像素为单位
    	DWORD biHeight; // 位图的高度,以像素为单位
    	WORD biPlanes; // 目标设备的位平面数,必须为1
    	WORD biBitCount; // 每个像素的位数,必须是1(单色)、4(16色)、8(256色)或24(真彩色)
    	DWORD biCompression; // 位图的压缩类型,必须是0(不压缩)、1(BI-RLE8压缩类型)或2(BI-RLE4压缩类型)
    	DWORD biSizeImage; // 位图的大小,以字节为单位
    	DWORD biXPeIsPerMeter; // 位图的目标设备水平分辨率,以每米像素数为单位
    	DWORD biYPeIsPerMeter; // 位图的目标设备垂直分辨率,以每米像素数为单位
    	DWORD biClrUsed; // 位图实际使用的颜色表中的颜色变址数
    	DWORD biClrImpotant; // 位图显示过程中被认为重要颜色的变址数
    } BITMAPINFOHEADER;
    

      (2)bmiColor[ ]是一个颜色表,用于说明位图中的颜色。它有若干个表项,每一表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD的定义如下:

    typedef tagRGBQUAD{
    	BYTE rgbBlue;
    	BYTE rgbGreen;
    	BYTE rgbRed;
    	BYTE rgbReserved;
    } RGBQUAD;
    

      在RGBQUAD定义的颜色中,蓝色的亮度由rgbBlue确定,绿色的亮度由rgbGreen确定,红色的亮度由rgbRed确定。rgbReserved必须为0。
      例如:若某表项为00,00,FF,00,那么它定义的颜色为存红色。
      bmiColor[ ]表项的个数由biBiCount来定:
      当 biBitCount = 1、4、8 时,bmiColor[ ]分别有 2,16,256 个表项。若某点的像素值为 n,则该像素的颜色为bmiColor[n]所定义的颜色。
      当 biBitCount = 24 时,bmiColor[ ]的表项为空。位图阵列的每 3 个字节代表一个像素,3 个字节直接定义了像素颜色中蓝、绿、红的相对亮度,因此省去了bmiColor[ ]颜色。

    2.3. 位图数据

      位图阵列记录了位图的每一个像素值。在生成位图文件时,Windows从位图的左下角开始(即从左到右从下到上)逐行扫描位图,将位图的像素值一一记录下来。这些记录像素值的字节组成了位图阵列。位图阵列有压缩和非压缩两种存储格式。
      (1)非压缩格式。在非压缩格式中,位图的每个像素值对应位图阵列的若干位(bits),位图阵列的大小由位图的亮度、高度及位图的颜色数决定。
       a.位图扫描行与位图阵列的关系
      设记录一个扫描行的像素值需 n 个字节,则位图阵列的 0 至 n-1 个字节记录了位图的第一个扫描行的像素值;位图阵列的 n 至 2n-1 个字节记录了位图的第二个扫描行的像素值;依此类推,位图排列的 (m-1) x n 至 m x n - 1 个字节记录了位图的第 m 个扫描行的像素值。位图阵列的大小为 n * biHeight。
      当 (biWidth * biBitCount) mod32 = 0 时,n = (biWidth * biBitCount) / 8
      当 (biWidth * biBitCount) mod32 ≠ 0 时,n = (biWidth * biBitCount) / 8 + 4
      上式中 +4 而不是 +1 的原因是为了使一个扫描行的像素值占用位图阵列的字节数为 4 的倍数(Windows规定其必须在long边界结束),不足的位用 0 补充。
       b.位图像素值与位图阵列的关系(以第 m 扫描行为例)
      设记录第 m 个扫描行的像素值的 n 个字节分别为a0,a1,a2,···,则
      当 biBitCount = 1 时:a0 的 D7 记录了位图的第 m 个扫描的第 1 个像素值,D6位记录了位图的第 m 个扫描行的第 2 个像素值,···,D0 记录了位图的第 m 个扫描行的第 8 个像素值,a1 的 D7 位记录了位图的第 m 个扫描行的第 9 个像素值,D6 位记录了位图的第 m 个扫描行的第 10 个像素值··· ···
      当 biBitCount = 4 时:a0 的 D7 ~ D4 位记录了位图的第 m 个扫描行的第 1 个像素值,D3 ~ D0 位记录了位图的第 m 个扫描行的第 2 个像素值,a1 的 D7 ~ D4 位记录了位图的第 m 个扫描行的第 3 个像素值··· ···
      当 biBitCount = 8 时:a0 记录了位图的第 m 个扫描行的第 1 个像素值,a1 记录了位图的第 m 个扫描行的第 2 个像素值··· ···
      当 biBitCount = 24 时:a0、a1、a2 记录了位图的第 m 个扫描行的第 1 个像素值,a3、a4、a5 记录了位图的第 m 个扫描行的第 2 个像素值··· ···
      位图其他扫描行的像素值与位图阵列的对应关系与此相似。
      (2)压缩格式。Windows支持 BI_RLE8 及 BI_RLE4 压缩位图存储格式,压缩减少了位图阵列所占用的磁盘空间。
       a. BI_RLE8 压缩格式
      当biCompression = 1 时,位图文件采用此压缩编码格式。压缩编码以两个字节为基本单位。其中第一个字节规定了用两个字节所指定的颜色出现的连续像素的个数。
      例如,压缩编码 05 04 表示从当前位置开始连续显示 5 个像素,着 5 个像素的像素值均为 04。
      在第一个字节为零时,第二个字节有特殊的含义:0——行末;1——图末;2——转义后面的两个字节,这两个字节分别表示一个像素从当前位置开始的水平位移和垂直位移;n (0x003 < n < 0xFF)——转义后面的 n 个字节,其后的 n 像素分别用这 n 个字节所指定的颜色画出。注意:实际编码时必须保证后面的字节数是 4 的倍数,不足的位用 0 补充。
       b. BI_RLE4 压缩格式
      当 biCompression = 2时,位图文件采用此种压缩编码格式。它与 BI_RLE8 的编码方式类似,唯一的不同是:BI_RLE4 的一个字节包含了两个像素的颜色。当连续显示时,第一个像素按字节高四位规定的颜色画出··· ···直到所有像素都画出为止。
      归纳起来,BMP图像文件有下列四个特点:
       I. 改格式只能存放一幅图像。
       II. 只能存储单色、16色、256色或彩色四种图像数据之一。
       III. 图像数据有压缩或不压缩两种处理方式,压缩方式为:RLE_4 和 RLE_8。RLE_4只能处理 16 色图像数据;而 RLE_8 则只能压缩 256 色图像数据。
       IV. 调色板的数据存储结构较为特殊。

      看到这里BMP的文件格式就介绍完了,本次进行编码实现的主要是不压缩的数据格式,压缩的数据格式等到以后有机会再详细介绍。

    2.4. 再说一种坐标系

      说完了BMP文件格式,我们再说一说图像坐标系5,下面这张图片是小贾画的图像坐标系和图像的存储顺序。这张图可能有助于你理解下面代码中对于像素的提取。

    3. 编码实现

    3.1. 创建一个C(C++)项目

      首先我们打开任何一个能进行C语言编程的编译,建立一个空项目的控制台程序,新建一个CPP文件,并将Lena.bmp拷到项目文件夹中(这里我以Visual Studio 2015 为例,点击图片可以看大图)。
    新建项目图片1
    新建项目图片2
    新建项目图片3
    新建项目图片4
    在这里插入图片描述

    3.2. 编码

      在编译器中写上下面的代码(下面的代码是灰度图的读取,关于后面多波段的读取,我们以后在再介绍)。

    #include <stdio.h> // C语言代码中必须要引用的头文件
    #include <windows.h> // 图像读取的头文件
    
    // 使代码在新版本的VS中正常运行不报错
    #define _CRT_SECURE_NO_WARNINGS
    #pragma warning(disable:4996)
    
    // 定义一个结构体来读取BMP的信息
    typedef struct {
    	// 定义文件头信息
    	BITMAPFILEHEADER header;
    	// 定义位图信息头
    	BITMAPINFOHEADER info;
    	// 定义彩色表
    	RGBQUAD rgb[256];
    	// 定义位图数据指针
    	unsigned char *data;
    } BMP;
    
    // 读图像函数
    void bmpRead(const char *bmpPath, BMP &bmp) {
    	// 以二进制的方式打开图片
    	FILE *file = fopen(bmpPath, "rb");
    	// 读取文件信息头
    	fread(&bmp.header, sizeof(BITMAPFILEHEADER), 1, file);
    	// 读取位图信息头
    	fread(&bmp.info, sizeof(BITMAPINFOHEADER), 1, file);
    	// 读取彩色表
    	fread(&bmp.rgb, sizeof(RGBQUAD), 256, file);
    	// 定义位图数据内存大小
    	bmp.data = new unsigned char[bmp.info.biWidth * bmp.info.biHeight];
    	// 读取元素的位图数据
    	fread(bmp.data, sizeof(unsigned char), bmp.info.biWidth*bmp.info.biHeight, file);
    	// 关闭图片
    	fclose(file);
    }
    
    // 定一个函数将读取到bmp.data的像素灰度值存储到一个txt文档中
    void bmpCells(const char *pixelValuePath, BMP &bmp){
    	// 新建一个txt文件用于存储像素值
    	FILE *file = fopen(pixelValuePath, "w");
    	// 循环读取像素值
    	for (int i = 0; i < bmp.info.biHeight; i++)
    	{
    		for (int j = 0; j < bmp.info.biWidth; j++)
    		{
    			// 获取循环到像元的像素值
    			unsigned char pixel = bmp.data[j + i*bmp.info.biWidth];
    			// 这里我们打印一下读出的像元
    			printf("%d ", pixel);
    			// 保存到文件中
    			fprintf(file, "%d ", pixel);
    		}
    		// 打印一行后换行
    		printf("\n");
    		// 完成一行像素的保存后换行继续进行保存
    		fprintf(file, "\n");
    	}
    	// 关闭文件
    	fclose(file);
    }
    
    int main() {
    	// 定义图像结构体
    	BMP mbmp;
    	// 读取图像(如果不是按照本文的新建项目方法,建议使用绝对路径,否则可能会因为文件路径错误而报错。)
    	bmpRead("../lena.bmp", mbmp);
    	// 将像素值存储到一个txt文本中
    	bmpCells("../pixelValue.txt", mbmp);
    	// 删除指针,释放内存
    	delete[] mbmp.data;
    	// 使程序暂停,便于查看
    	scanf("……");
    
    	return 0;
    }
    

    4. 验证一下结果

    4.1. 结果图

      接下来让我们看一下运行的结果。
    在这里插入图片描述
    在这里插入图片描述

    4.2. 验证正确性

      如果你了解遥感图像处理,那么你一定会知道 ERDAS IMAGE 这个软件,现在我们就用这个软件来验证我们编码的结果是否正确。下图中是我们在ERDAS IMAGE中打开的图像像素值。
    在这里插入图片描述
      通过上面的初步对比,我们我们可以看出我们读取的像素值是正确的。

      这节的介绍我们到这里就结束了,有什么错误欢迎大家指出。下一节我继续介绍《数字图像处理(二)——BMP图像的统计》,下节将介绍如何获取图像像素的最小值、最大值、均值、标准差、计算图像的熵、以及统计图像灰度直方图。


    1. Lena图像:了解更多关于Lena图像的信息,请转到Lena图像的百度百科介绍↩︎

    2. 图像格式:BMP仅是众多图像格式中的一种,了解更多的格式请转到图像格式的百度百科介绍↩︎

    3. C语言编程入门教程:网上关于C语言的编程的内容很多。例如,菜鸟教程MOOC慕课平台。小贾这里给列出两种,仅供参考。 ↩︎

    4. BMP文件格式:关于BMP文件格式的介绍来源于《数字图像处理(第三版)》(贾永红版)。 ↩︎

    5. 图像坐标系:图像坐标系的介绍大家可以在百度百科中找到。 ↩︎

    展开全文
  • 分分钟就能出炉使用,不像net写个小程序,配置和编译花的精力都比写代码多,所以简单实现一下BMP图像文件的读取、显示与存储。 一、新建工程 1、新建一个exe文件 2、保存文件 3、窗体上建立图片框 4、加入控制...


    现在很多工业设计还在使用vb开发,稍微懂点历史的人,都知道VB语法比C类先进太多,vb写出的程序体积很小,那些重量级语言写出的程序没写代码都要占上百KB,用VB写到上百KB的程序已经是功能相当齐全的了。

    vb编写小工具首选,分分钟就能出炉使用,不像net写个小程序,配置和编译花的精力都比写代码多,所以简单实现一下BMP图像文件的读取、显示与存储。

    一、新建工程

    1、新建一个exe文件

    vb-001

    2、保存文件

    vb-002

    3、在窗体上建立图片框

    vb-003

    4、加入控制按钮

    vb-004

    二、编程实现

    1、双击窗体,加入程序

    工程1窗体的编程界面,将一下写入

    Private Sub Command1_Click()
    Picture1.AutoSize = True 'ÉèÖÃPictureµÄ´óС¿ÉÒÔËæ¶ÁÈëͼƬ½øÐб仯£¬Ê¹ÆäÓëͼƬµÄ´óСÏà·û
    Picture2.AutoRedraw = True 'ÉèÖÃPicture2¿É½øÐÐÖØ»­
    Command1.Caption = "打开图像"
    Command2.Caption = "保存图像"
    Command3.Caption = "图像灰度化"
    Command4.Caption = "保存灰度图像"
    Command5.Caption = "退出"
    End Sub
    

    vb-005

    2、点击运行按钮,观察效果

    vb-006

    3、对Command1(打开图像)图像进行编程

    Private Sub Command1_Click()
    Picture1.Picture = LoadPicture("D:\pic\HG.bmp") '打开并显示图片
    Picture2.Width = Picture1.Width '设置picture2的宽度与picture1的相同
    Picture2.Height = Picture1.Height '设置picture2的高度与picture1的相同
    End Sub
    

    vb-007

    4、点击“打开图像”显示效果

    vb-008

    5、对Command2(保存图像)图像进行编程

    
    Private Sub Command2_Click()
    SavePicture Picture1.Picture, "D:\pic\new.bmp"
    End Sub
    

    vb-009

    6、对Command3(图像灰度化)图像进行编程

    Private Sub Command3_Click()
    For i = 0 To Picture1.Width - 1
    For j = 0 To Picture1.Height - 1
    c = Picture1.Point(i, j)
    R = c And &HFF&
    G = (c And &HFF00&) / 256
    B = (c And &HFF0000) / 65535
    y = (R + G + B) / 3
    Picture2.PSet (i, j), RGB(y, y, y)
    Next j
    Next i
    End Sub
    

    vb-010

    7、对Command4(保存图像)进行编程

    Private Sub Command4_Click()
    SavePicture Picture1.Picture, "D:\pic\gray.bmp"
    End Sub
    

    vb-011

    8、对Command5(退出)进行编程

    Private Sub Command5_Click()
    End
    End Sub
    

    vb-012

    三、成果展示

    实现BMP图像文件的读取、显示与存储
    vb-013

    展开全文
  • BMP图像信息隐藏

    2021-03-16 03:38:37
    图像隐写算法LSB—Least Significant Bits,又称最不显著位。LSB算法就是将秘密信息嵌入到载体图像像素值得最低有效位,改变这一位置对载体图像的品质影响最小。原理如下:以实验用的24位真彩图为例,每个像素用3...

    图像隐写算法LSB—Least Significant Bits,又称最不显著位。LSB算法就是将秘密信息嵌入到载体图像像素值得最低有效位,改变这一位置对载体图像的品质影响最小。

    原理如下:

    以实验用的24位真彩图为例,每个像素用3Byte表示,每Byte分别表示R、G、B三色的亮度,亮度取值范围位0~0xFF。采用LSB算法就是将图像信息的每一Byte的最后一位二进制替换为待嵌入的秘密信息的一位,按顺序进行。因为对最后一位的替换操作其实就是对亮度信息的加一或减一,对颜色影响甚微,所以肉眼难以察觉,这就达到了隐藏信息的目的。对于24位真彩图,所能嵌入的最大秘密信息的大小为像素数量的3/8字节

    步骤如下:

    以二进制的方式读取载体图像并分别头数据与像素数据

    用二进制秘密信息中的每一笔特信息替换与之对应的载体数据的最低有效位

    利用得到的新的二进制数据构造图像,即得到含有秘密信息的隐秘图像

    /***

    change.c

    ***/#include#include#include"define.h"

    intmain()

    {//创建头文件,信息头结构变量

    BMP_FILE_HEADER fileHeader;

    BMP_INFO_HEADER infoHeader;//打开载体图像文件,新建修改后的图像文件

    FILE *file = fopen("football.bmp","rb");

    FILE*newFile = fopen("change.bmp","wbx");//读取文件头,信息头

    fread(&fileHeader,14,1,file);

    fread(&infoHeader,40,1,file);//读取24位真彩图像的像素信息

    RGB *img = (RGB *)malloc(infoHeader.sizeImage);

    fread(img,infoHeader.sizeImage,1,file);

    printf("Picture Size(width x height):%d x %d \n", infoHeader.width, infoHeader.height);//对图片内容进行修改,每隔五个像素染黑一个像素

    int i = 0;for (i = 0; i < infoHeader.sizeImage / 3; i += 5)

    {

    img[i].red= 0;

    img[i].green= 0;

    img[i].blue= 0;

    }

    printf("fwirte\n");//将新的二进制文件写入到新文件中

    fwrite(&fileHeader,14,1,newFile);

    fwrite(&infoHeader,40,1,newFile);

    fwrite(img,infoHeader.sizeImage,1,newFile);

    fclose(file);

    fclose(newFile);return 0;

    }

    修改图像内容的核心代码如下:

    int i = 0;for (i = 0; i < infoHeader.sizeImage / 3; i += 5)

    {

    img[i].red= 0;

    img[i].green= 0;

    img[i].blue= 0;

    }

    infoHeader.sizeImage表示图像数据的字节数,在24位真彩位图中,表示每个像素需要三个字节,infoHeader.sizeImage/3表示位图总像素数

    循环体中将每个颜色分量的亮度赋值为0,让像素变黑,最终得到修改后的图像。

    以上是处理BMP图像信息的原理。

    下面通过LSB算法隐藏秘密信息,这里把define.h文件作为秘密信息隐藏,也可以选择任何大小合适的文件作为秘密信息。

    /***

    define.c

    ***/typedef unsignedshort WORD; //2 byte

    typedef unsigned int DWORD; //4 byte

    typedef unsigned char BYTE; //1 byte//head of file

    typedef structBMP_FILE_HEADER

    {

    WORD type;

    DWORD size;

    WORD reserved1;

    WORD reserved2;

    DWORD offBits;

    }BMP_FILE_HEADER;//head of infomation

    typedef structBMP_INFO_HEADER

    {

    DWORD size;intwidth;intheight;

    WORD planes;

    WORD bitCount;

    DWORD compression;

    DWORD sizeImage;intxPelsPerMeter;intyPelsPerMeter;

    DWORD colorUsed;

    DWORD colorImportant;

    }BMP_INFO_HEADER;//RGBQUAD

    typedef structRGBQUAD

    {

    BYTE blue;

    BYTE green;

    BYTE red;

    BYTE reserved;

    }RGBQUAD;//RGB

    typedef structRGB

    {

    BYTE blue;

    BYTE green;

    BYTE red;

    }RGB;

    隐藏信息代码:

    /***

    hide.c

    ***/#include#include#include#include#include"define.h"

    //获取文件大小

    int getFileSizeSystemCall(char *strFileName)

    {structstat temp;

    stat(strFileName,&temp);returntemp.st_size;

    }intmain()

    {//创建文件头,信息头结构体变量

    BMP_FILE_HEADER fileHeader;

    BMP_INFO_HEADER infoHeader;//打开载体图像文件,读取文件头和信息头,打开隐秘图像信息

    FILE *file = fopen("football.bmp","rb");

    FILE*newFile = fopen("hide.bmp","wbx");

    fread(&fileHeader,14,1,file);

    fread(&infoHeader,40,1,file);//读取秘密信息文件“define.h”

    int infoSize = getFileSizeSystemCall("define.h");

    printf("info size : %d\n",infoSize);

    BYTE*info = (BYTE *)malloc(infoSize);

    FILE*infoFile = fopen("define.h","rb");

    fread(info,infoSize,1,infoFile);//读取24位真彩图像像素信息

    BYTE *img = (BYTE *)malloc(infoHeader.sizeImage);

    fread(img,infoHeader.sizeImage,1,file);

    printf("Picture Size (Width x height) : %d x %d\n",infoHeader.width,infoHeader.height);

    printf("Can hide %d byte infomation\n",infoHeader.sizeImage/8);//LBS算法实现,把隐秘信息的每一个字节8bit按照低字节到高字节的顺序隐藏到像素信息的//每8byte中的最低位

    int i = 0,j = 1;

    BYTE tmp= 0x00;for(i = 0; i < infoSize; i++)

    {for(j = 0; j < 8; j++)

    {

    tmp= info[i] &0x01;if(tmp)

    {

    img[i*8+j] = img[i * 8 + j] | 0x01;

    }else{

    img[i*8+j] = img[i * 8 + j] & 0xfe;

    }

    info[i]= info[i] >> 1;

    }

    }//将修改后的二进制数据写入到隐秘图像文件中

    fwrite(&fileHeader,14,1,newFile);

    fwrite(&infoHeader,40,1,newFile);

    fwrite(img,infoHeader.sizeImage,1,newFile);

    fclose(file);

    fclose(newFile);return 0;

    }

    LSB算法实现:

    int i = 0,j = 1;

    BYTE tmp= 0x00;for(i = 0; i < infoSize; i++)

    {for(j = 0; j < 8; j++)

    {

    tmp= info[i] &0x01;if(tmp)

    {

    img[i*8+j] = img[i * 8 + j] | 0x01;

    }else{

    img[i*8+j] = img[i * 8 + j] & 0xfe;

    }

    info[i]= info[i] >> 1;

    }

    }

    info[i]是存储秘密信息的数组,通过把像素Byte数据与0x01按位或运算使得最后一位为1,通过把像素Byte数据与0xfe(1111,1110)做按位与运算使得最后一位为0(0 & x = 0)

    stat函数用来获取指定路径下文件或文件夹的属性。路径可以不指定。

    使用md5sum命令查看两张图片的MD5 HASH值

    7acc447008ee55c24bcd8945228ac8f9.png

    再对比一下文件的16进制内容,先使用xxd命令生成16进制内容:

    xxd football.bmp > football.hex

    xxd hide.bmp > hide.hex

    再使用sed命令查看对比第五行内容

    sed -n 5p football.hex

    sed -n 5p hide.hex

    3758bd48d3e7b4bfedb11103dd146697.png

    很明显的可以看到像素数据的每一字节的最后一位发生了变化,验证了LSB算法的原理。

    提取信息

    /***

    extract.c

    ***/#include#include#include"define.h"

    intmain()

    {//创建头文件,信息头结构体变量

    BMP_FILE_HEADER fileHeader;

    BMP_INFO_HEADER infoHeader;//读取隐秘图像文件,创建秘密信息文件

    FILE *file = fopen("hide.bmp","rb");

    FILE*extractFile = fopen("extract.txt","wbx");

    BYTE*info = (BYTE *)malloc(738);//读取头文件,信息头

    fread(&fileHeader,14,1,file);

    fread(&infoHeader,40,1,file);//读取24位真彩图像的像素信息

    BYTE *img = (BYTE *)malloc(infoHeader.sizeImage);

    fread(img,infoHeader.sizeImage,1,file);

    printf("Picture size : %d x %d \n",infoHeader.width,infoHeader.height);//信息提取部分,根据秘密信息的长度,依次读取隐秘图像信息像素信息的最低bit,凭借成Byte

    int i = 0,j = 0;

    BYTE tmp= 0x00,ttmp = 0x00;for(i = 0; i < 738; i++)

    {

    tmp= 0x00;for(j = 0; j < 8; j++)

    {/*取每8位bit像素信息的最后一位拼接为1Byte的秘密信息*/ttmp= img[i*8+j] & 0x01;

    ttmp= ttmp << j; //左移j位

    tmp += ttmp; //每一位累加得到1Byte的tmp值

    }

    info[i]=tmp;

    }//将提取的信息写入到秘密文件中

    fwrite(info,738,1,extractFile);

    fclose(file);

    fclose(extractFile);return 0;

    }

    使用md5sum查看两个文件是否相同

    md5sum define.h extract.txt

    1f10b0a12663d4e0fba8ee7429f7fa1a.png

    提取过程就是隐藏过程的逆过程,实现原理和隐藏过程类似。需要注意的是,此处使用的文件长度是固定的秘密信息的长度,并且提前知道了隐藏信息包含在了指定图片中。在实际处理中,在隐藏秘密信息时,往往还需要一个嵌入标识和长度信息,来帮助程序判断图片中是否包含秘密信息,并说明秘密信息长度

    拓展

    修改 hide.c 并使用手动输入的数字作为密钥来规定秘密信息隐藏与载体图片的起始位置。

    修改 extract.c 并根据输入的秘钥提取秘密信息

    每 Byte 像素信息隐藏 2bit 的秘密信息(MLSB 算法)

    展开全文
  • 文件夹写入图像 imwrite("./111/maoqiubiaozhu_" + std::to_string(i) + ".bmp", src);//项目目录下,新建一个111的文件夹其中放入图像
  • 使用软件:Visual Studio 2010中Visual C++ 下Win32 控制台应用程序【使用visual studio 2012也可以,2017版的貌似一般下载安装后使用会缺少一些文件,导致运行错误(新建C++项目没有导航,就会后面运行出错)】 ...
  • 图像处理之python读取bmp(1/4/8/16/24位)

    千次阅读 2020-10-14 15:54:18
    首先用Photoshop打开一张正常的jpg图片,接着储存中选择bmp格式,分别选择24位和16位,但是1,4,8位无法选择,此时新建一张画布,创建时选择8位,然后将上述图片导入画布,点击图像-模式-位图,并且按照上述
  • 创建一个bmp格式的简单方法

    千次阅读 2016-12-21 20:32:16
    MFC编程中会涉及到位图的显示,那么我们如何创建一个能够用于VS导入的bmp格式位图呢,方法如下: 1.将JPG格式的图片用“画图”软件打开 2.点击左上角的“下拉菜单”->另存为->"BMP图片格式"->类型选择“24位位图”...
  • github项目地址:...一、项目语言 C++(std=C++11) 二、操作系统 windos10+ubuntu16.04 均测试通过 三、运行方式 进入目录内 ...cd ImageCompression ...新建build目录 mkdir build cmake编译项目,生成M
  • python批量新建文件、批量保存图片、批量创建文件夹 新建文件: ## 假设我要新建10个txt文件 for i in range(10): ##这里的./指代的是当前文件夹, %i表示文件的名称 f = open('./%s'%i + '.txt',"w") f.write...
  • 2、对本身就是gray的图像不做处理; 3、文件命名机制和搜索文件的机制做了修改; 意义: 通过该代码可以对文件夹操作有新一步的认识,对文件命名机制有新的认识; 实验截图: 未命名.bmp ...
  • 1.新建一个基于对话框的工程,对话框类中定义如下变量 // Local iconic variables HObject ho_Image; // Local control variables HTuple hv_ImageFiles, hv_Index; afx_msg void OnBnClickedButton1(); /...
  • 想要将图片的文件格式批量的转换为bmp的格式,有没有简单的操作方法呢?这算大家问对人了,今天小编就来教大家一个简单的方法,来转换图片的格式。 大家先来看看小编之前用这个方法转换格式的图片效果如何,上次...
  • 熟悉文件和文件夹的基本操作,对于小伙伴们管理计算机...1. 新建文件新建文件的方法有两种,一种是通过右键快捷菜单新建文件,另一种是应用程序中新建文件。⑴ 通过右键快捷菜单新建文件这里以新建一个扩展名为“....
  • 目前列有【新建】、【打开】、【保存】、【另存为】、【关闭】以及【关闭所有】,如下所示。 目前功能已实现的有【打开】、【保存】、【另存为】和【关闭】。 #####【打开】: 进入选择图片对话框,目前约束选择的...
  • 图像写入图形文件

    2021-04-18 13:51:07
    A - 图像数据矩阵图像数据,指定为满(非稀疏)矩阵。对灰度图像而言,A 可以是 m×n。对索引图像而言,A 可以是 m×n。指定 map 输入参数中的相关颜色图。对真彩色图像而言,A 必须是 m×n×3 的矩阵。imwrite 不支持...
  • ['C:\\Users\\zzs\\Desktop\\a\\55.bmp.txt', 'C:\\Users\\zzs\\Desktop\\a\\新建文件夹\\11.bmp.txt']
  • #!/bin/sh while read line do cp $line /home/liuyu/red_out_.../home/liuyu/red_out_shujuji/test/20210517_210057_845_bmp.rf.086e170d6df369470a59fe75f5f45ee2.jpg /home/liuyu/red_out_shujuji/test/fire_177_b
  • Halcon创建文件夹

    2021-07-05 17:46:19
    Halcon创建文件夹 ... make_dir (output_images_path+'/'+i) //新建一个文件夹 endif write_image(ColSlopeRotate, 'bmp', 0, output_images_path+'/'+i+'/SlopeColorRow.bmp') *dev_display(ColorRow)
  • 系列文章目录 一、Pygame的安装与项目规划 二、开始游戏项目:创建pygame窗口及响应...现在我们可以屏幕上添加新的元素了,比如飞船,那么肯定要有飞船的图像、大小、等等,我们或许要设置两种飞船比如外星飞船或..
  • Python中的图像处理(第九章)Python图像增强前言一. Python准备二. Python仿真三. 小结 前言 随着人工智能研究的不断兴起,Python的应用也不断上升,由于Python语言的简洁性、易读性以及可扩展性,特别是开源...
  • imwrite 将图像写入图形文件 基本语法调用格式: imwrite(A,filename) imwrite(A,map,filename) ...imwrite 当前文件夹中创建新文件。输出图像的位深取决于 A 的数据类型和文件格式。对于大多数格式来说
  • 日常办公使用电脑的时候,我们都常常面对一些简单却繁琐的工作,却因为没掌握更为快捷的操作,而陷入一种重复操作的死循环。举个例子,将一份上百页的PPT导出文字,对100张图片重命名批量排序,又或者是推文链接...
  • matlab新建文件夹及copy文件 clc ; clear ; for k=1:50 failname = dir('C:\Documents and Settings\Administrator\桌面\users\*.*') ; [row col ] = size(failname); for i =3:row path = ['C:\Documents and ...
  • MATLAB之图像分块处理

    千次阅读 2021-05-08 16:15:28
    file_path = 'D:/MATLAB/bin...% 图像文件夹路径img_path_list = dir(strcat(file_path,'*.tif'));%获取该文件夹中所有jpg格式的图像img_num = length(img_path_list);%获取图像总数量if img_num > 0 %有满足条件...
  • bmp图片批量改成jpg

    2022-03-30 23:08:03
    bmp图片批量改成jpg格式
  • (2017年电大)电大计算机网考windows操作系统操作系统1....操作提示:①打开考生文件夹,单击鼠标右键,选择“新建”→“文件夹”,修改新文件夹的默认名称“新建文件夹”为“图片2”。②找到考生文件夹下的“...
  • bmp图片灰度化和二值化

    千次阅读 多人点赞 2020-03-12 20:58:30
    C语言去除bmp图片的背景一、前言二、灰度化头文件C文件三、二值化 一、前言 图像处理中,大部分的处理方法都需要事先把彩色图转换成灰度图才能进行相关的计算、识别。 彩色图转换灰度图的原理如下: 我们知道彩色...
  • 利用matlab读取图像

    千次阅读 2021-04-18 08:35:58
    怎样用matlab读取20张图片并依次展示出来指定路径下 单个文件夹data中所有图像 P = '.\data\';% 图像文件夹路径 img_path_list = dir(strcat(P,'*.jpg'));%获取该文件夹中所有jpg格式的图像 N = length(img_path_...
  • 我们常见的图像格式有 .bmp,.gif,.jpg,.png等,而.bmp格式的图像是没有经过压缩的,其他3种都是经过编码压缩格式。所以读取之后要进行解码还原。 图像解码与编码 一张RGB三通道的彩色图像可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,996
精华内容 1,598
关键字:

在文件夹新建bmp图像