⊙你很牛吗?那就快进来看看!!!帮帮忙!!!!下午散分⊙(100分)

  • 主题发起人 主题发起人 子瑜
  • 开始时间 开始时间

子瑜

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一些bmp位图文件,我想问:
怎样操作其中的数据区数据?就是要修改其中的数据区数据。
而文件头,位图信息头保持不变。颜色由24位转为8位。
关键问题是只操作位图中的位图数据(像素值),怎样搞啊?
最好能有例子。不要用其他的工具,直接在Delphi中写程序来
修改。各位大佬!帮帮忙啊!!
 
bmp.format=pf8//原来为24,我记不住怎么写了但是这个意思
 
tmpBitmap->PixelFormat=TPixelFormat(6);
变通一下试试
 
>>位图信息头保持不变。颜色由24位转为8位
这句话是不是很矛盾呀?颜色本身是信息头的一部分。

用Bitmap对象就足够了呀。
Src, Dest: TBitmap;
R: TRect;

Src := TBitmap.Create;
Dest := TBitmap.Create;
try
Src.LoadFromFile('xxx.bmp');
Dest.Width := Src.Width
Dest.Height := Dest.Height;
Dest.PixelFormat := pf8bit;
R := Rect(0, 0, Src.Width - 1, Height - 1);
Dest.StretchDraw(R, Src);
Dest.SaveToFile('yyyy.bmp');
finally
Src.Free;
Dest.Free;
end;
 
直接锁定像素区修改数据也不是不行,但是因为你颜色数改了,像素数据区的大小发生了
变化,以上代码可以不依赖Graphics,用Windows的GDI来实现。但过程肯定是一样的。
 
那其中的像素数据区数据怎样操作啊?如要修改像素数据区数据第m个字节到n个字节的数据?怎么搞啊?
 
当然也可以操作。在Bitmap中提供的是ScanLine属性。在GDI中是一段内存。根据你想得到
的偏移位置计算出在内存中的偏移,可以直接修改。每一种颜色深度其格式不大一样。记
住两点:
一、每行的数据以4字节对齐,如果不到4字节必须补齐。
二、高位在前,低位在后,例如你从内存中取出一个DWORD,如果你是8位深度,则最低位
才是你关心的内容。
 
to barton:
to all:
能给个例子吗?
 
什么例子?我那个关于DelphiX的贴子上有个读BMP像素的例子,你去看看也许能明白。不过
不是用的Bitmap而是GDI。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1723095
 
谢谢!功力不高,看了头晕,还是用bitbmp来解答我的问题吧,
我还可以另开加分啊!
 
为什么还不用
tmpBitmap.PixelFormat=Pf8哪
你试验一下再说
 
to zhoufujin:
大哥啊!你说的那个问题已不是问题了。
我指的是:
其中的像素数据区数据怎样操作啊?如要修改像素数据区数据第m个字节到n个字节的数据?怎么搞啊?
最好是用Tbitbmp来解决问题。
 
bt:Tbitmap;
line:pbytearray;

bt:=Tbitmap.create;
bt.loadfromfile('');
bt.PixelFormat := pf24bit;
line:=pbytearray(bt.scanline[y]);// y:要得到图象像素的行。line 是一个指针,第一个像素的值是line[0],line[1],line[2]代表rgb三色,以后类推。
bt.pixlformat:=pf8bit;
bt.savetofile('');
bt.free;
//line 的值可读,可写。
大概就这样,得到像素值还有一个函数,getRvalue(bt.Canvas.Pixels[x,y]) 红;getGvalue(bt.Canvas.Pixels[x,y]) 绿;getBvalue(bt.Canvas.Pixels[x,y]) 蓝;
设置时,用bt.Canvas.Pixels[x,y]:=rgb(R,G,B);
写的应该很明白,有什么问题在说。
在加一点,在事件中用,需要刷新。(把程序最小化,在还原就可以了)否则你可能看不到效果。





 
要得到m~n字节的内容,可以这样操作:
P0, Pm, Pn: PByteArray;

P0 := PByteArray(Bitmap.ScanLine[0]);
Pm := P0;
Pn := P0;
Inc(Pm, M); Pm指向M开始的字节
Inc(Pn, N); Pn指向N开始的字节
 
to chen_cch:
Very good!!!
已经接近我想要知道的东西了。
我去试试看。
 
感谢牛人们,结账!!!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
612
import
I
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部