本菜鸟用的是彭国伦的Fortran教材(这不是重点)
里面在文件读写部分有例题,是打开某二进制文件(是个灰度图片,lena.raw),然后黑白翻转重输出保存
附其源程序(书中所带):
program ex0922
use typedef !!这我确定是多余没用的,而且本文件内也没这module
implicit none
integer, parameter :: recl_unit = 4
integer, parameter :: buffer_size = 256*256
character :: cbuffer(buffer_size)
integer :: ibuffer(buffer_size)
integer :: error, i, code
open(10, file="lena.raw", form="unformatted", access="direct",&
recl=256*256/recl_unit, status="old", iostat=error)
if ( error/=0 ) then
write(*,*) "open lena.raw fail."
stop
end if
! 一个像素占1 byte, 刚好可以用字符数组来读入
read(10, rec=1) cbuffer
close(10)
do i=1, buffer_size
! 要取出每个字符的数值
code = ichar( cbuffer(i) )
! code返回值会是-128~127之间,要把它转换成0~255之间的数字
if ( code>=0 ) then
ibuffer(i)=code
else
ibuffer(i)=256+code
end if
!!我觉得这里多余,就直接替换成ibuffer(i)=code,结果并无影响,感觉应该是多位溢出所以不会有影响吧??
end do
! 把亮度值反相
do i=1, buffer_size
cbuffer(i)=char(255-ibuffer(i))
end do
! 文件代码10在上面已经close了, 可以再使用一次
open(10, file="newlena.raw", form="unformatted", access="direct",&
recl=256*256/recl_unit, status="replace")
write(10, rec=1) cbuffer
close(10)
stop
end
以上是源程序,红色备注是我自己加的(但这还不是重点)
重点是红色的加粗语句,它到底是啥意思?为啥recordlenth要256*256还除以4呢?不是说灰度图每个像素点都是正好1字节么??
求教高手!!!
附,图片lena.raw信息
![](http://imgsrc.baidu.com/forum/w%3D580/sign=c7147467d53f8794d3ff4826e21a0ead/9556b812c8fcc3ce96ac5eec9345d688d53f2043.jpg)
![](http://imgsrc.baidu.com/forum/w%3D580/sign=ff8176e834fae6cd0cb4ab693fb10f9e/eb9db7fd5266d016618e09f7962bd40734fa3524.jpg)
预期目标文件:
![](http://imgsrc.baidu.com/forum/w%3D580/sign=88565e15ae51f3dec3b2b96ca4eff0ec/379be61190ef76c6b2af6df49c16fdfaae5167b2.jpg)
里面在文件读写部分有例题,是打开某二进制文件(是个灰度图片,lena.raw),然后黑白翻转重输出保存
附其源程序(书中所带):
program ex0922
use typedef !!这我确定是多余没用的,而且本文件内也没这module
implicit none
integer, parameter :: recl_unit = 4
integer, parameter :: buffer_size = 256*256
character :: cbuffer(buffer_size)
integer :: ibuffer(buffer_size)
integer :: error, i, code
open(10, file="lena.raw", form="unformatted", access="direct",&
recl=256*256/recl_unit, status="old", iostat=error)
if ( error/=0 ) then
write(*,*) "open lena.raw fail."
stop
end if
! 一个像素占1 byte, 刚好可以用字符数组来读入
read(10, rec=1) cbuffer
close(10)
do i=1, buffer_size
! 要取出每个字符的数值
code = ichar( cbuffer(i) )
! code返回值会是-128~127之间,要把它转换成0~255之间的数字
if ( code>=0 ) then
ibuffer(i)=code
else
ibuffer(i)=256+code
end if
!!我觉得这里多余,就直接替换成ibuffer(i)=code,结果并无影响,感觉应该是多位溢出所以不会有影响吧??
end do
! 把亮度值反相
do i=1, buffer_size
cbuffer(i)=char(255-ibuffer(i))
end do
! 文件代码10在上面已经close了, 可以再使用一次
open(10, file="newlena.raw", form="unformatted", access="direct",&
recl=256*256/recl_unit, status="replace")
write(10, rec=1) cbuffer
close(10)
stop
end
以上是源程序,红色备注是我自己加的(但这还不是重点)
重点是红色的加粗语句,它到底是啥意思?为啥recordlenth要256*256还除以4呢?不是说灰度图每个像素点都是正好1字节么??
求教高手!!!
附,图片lena.raw信息
![](http://imgsrc.baidu.com/forum/w%3D580/sign=c7147467d53f8794d3ff4826e21a0ead/9556b812c8fcc3ce96ac5eec9345d688d53f2043.jpg)
![](http://imgsrc.baidu.com/forum/w%3D580/sign=ff8176e834fae6cd0cb4ab693fb10f9e/eb9db7fd5266d016618e09f7962bd40734fa3524.jpg)
预期目标文件:
![](http://imgsrc.baidu.com/forum/w%3D580/sign=88565e15ae51f3dec3b2b96ca4eff0ec/379be61190ef76c6b2af6df49c16fdfaae5167b2.jpg)