BMP图 ( 积分: 20 )

  • 主题发起人 主题发起人 soulhuman
  • 开始时间 开始时间
S

soulhuman

Unregistered / Unconfirmed
GUEST, unregistred user!
我要将24位图转为16位图,并读出每个象素的16进制值。
我是这样做的:
先将24位图改为16位图:
bmp:=Tbitmap.Create;
bmp.LoadFromFile(openpicturedialog1.FileName);
bmp.PixelFormat:=pf16bit;
image1.Assign(bmp);
bmp.free;
再读取每个象素的值并转为16进制:
for n:=image1.picture.Width-1 downto 0 do
begin
bmpread:='';
str:='';
for m:=0 to image1.Picture.height-1 do
begin
k1:=ColorToRGB(image1.Canvas.Pixels[m,n]);
str:=inttohex(k1,4);
bmpread:=bmpread+str;
end;
memo1.Lines.Add(bmpread);
end;

请大家看看哪里有问题?
我读取的值除了黑白之外都是错误的
 
我要将24位图转为16位图,并读出每个象素的16进制值。
我是这样做的:
先将24位图改为16位图:
bmp:=Tbitmap.Create;
bmp.LoadFromFile(openpicturedialog1.FileName);
bmp.PixelFormat:=pf16bit;
image1.Assign(bmp);
bmp.free;
再读取每个象素的值并转为16进制:
for n:=image1.picture.Width-1 downto 0 do
begin
bmpread:='';
str:='';
for m:=0 to image1.Picture.height-1 do
begin
k1:=ColorToRGB(image1.Canvas.Pixels[m,n]);
str:=inttohex(k1,4);
bmpread:=bmpread+str;
end;
memo1.Lines.Add(bmpread);
end;

请大家看看哪里有问题?
我读取的值除了黑白之外都是错误的
 
你要实现什么功能?24色-〉16色转换?还是读每个象素的16进制值?
 
24位转16位
不用pf16bit
 
前两天刚完成一个这样的程序:
procedure GetCromaData(BMPFileName:string);
var
bmp :TBitmap ;
x,y:integer;
CL:TColor;
R,G,B:WORD;
str:string;
begin
bmp:=TBitmap.Create;
bmp.LoadFromFile(BMPFileName);//打开待读取的图像文件
bmp.PixelFormat:=pf16bit;

for x:= 0 to Bmp.Width -1 do//获取RGB数据并写入文本文件
for y:= 0 to bmp.Height -1 do
begin
CL:=bmp.Canvas.Pixels[x,y];
R:=GetRValue(ColorToRGB(CL));
G:=GetGValue(ColorToRGB(CL));
B:=GetBValue(ColorToRGB(CL));

str:='{0x'+ inttoHex(R,2)+
',0x'+inttoHEX(G,2)
+',0x'+inttoHex(B,2)
+ '},'));
end;
bmp.Free;
end;
 
bmp.PixelFormat:=pf16bit;
我用这句话转后的,得到虽然是16位的,但是象素的数据不正确?
to 沉静如海
你的函数我试了,结果还是24位的?
16位图,每象素占2个字节,RGB分配为565,而你的转换方法是3个字节?
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure GetCromaData(BMPFileName:string);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure Tform1.GetCromaData(BMPFileName:string);
var
bmp :TBitmap ;
x,y:integer;
CL:TColor;
R,G,B:WORD;
str:string;
begin
bmp:=TBitmap.Create;
bmp.LoadFromFile(BMPFileName);//打开待读取的图像文件
bmp.PixelFormat:=pf16bit;

for x:= 0 to Bmp.Width -1 do//获取RGB数据并写入文本文件
for y:= 0 to bmp.Height -1 do
begin
CL:=bmp.Canvas.Pixels[x,y];
R:=GetRValue(ColorToRGB(CL));
G:=GetGValue(ColorToRGB(CL));
B:=GetBValue(ColorToRGB(CL));

Memo1.Lines.Add('{0x'+ inttoHex(R,4)+
',0x'+inttoHEX(G,4)
+',0x'+inttoHex(B,4)
+ '},');
end;
bmp.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
GetCromaData('0.bmp');
end;

end.

以下数据是将一个200x1的蓝->红->绿->渐变的8BIT 的图片转换成RGB值后得到的.
不知道你要得到的数据的是不是这样的.
{0x0000,0x0000,0x00FF},
{0x0000,0x0000,0x00FF},
{0x0000,0x0000,0x00FF},
{0x0000,0x0000,0x00FF},
{0x0000,0x0000,0x00FF},
{0x0000,0x0000,0x00FF},
{0x0000,0x0000,0x00FF},
{0x0000,0x0000,0x00FF},
{0x0000,0x0000,0x00FF},
{0x0000,0x0000,0x00FF},
{0x0000,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0018,0x0000,0x00CE},
{0x0031,0x0000,0x009C},
{0x0031,0x0000,0x009C},
{0x0031,0x0000,0x009C},
{0x0031,0x0000,0x009C},
{0x0031,0x0000,0x009C},
{0x0031,0x0000,0x009C},
{0x0031,0x0000,0x009C},
{0x0031,0x0000,0x009C},
{0x0031,0x0000,0x009C},
{0x0031,0x0000,0x009C},
{0x0031,0x0000,0x009C},
{0x0031,0x0000,0x009C},
{0x0031,0x0000,0x009C},
{0x0042,0x0000,0x0084},
{0x0042,0x0000,0x0084},
{0x0042,0x0000,0x0084},
{0x0042,0x0000,0x0084},
{0x0042,0x0000,0x0084},
{0x0042,0x0000,0x0084},
{0x0042,0x0000,0x0084},
{0x0042,0x0000,0x0084},
{0x0042,0x0000,0x0084},
{0x0042,0x0000,0x0084},
{0x0042,0x0000,0x0084},
{0x0042,0x0000,0x0084},
{0x0042,0x0000,0x0084},
{0x004A,0x0082,0x0063},
{0x004A,0x0082,0x0063},
{0x004A,0x0082,0x0063},
{0x004A,0x0082,0x0063},
{0x004A,0x0082,0x0063},
{0x004A,0x0082,0x0063},
{0x004A,0x0082,0x0063},
{0x004A,0x0082,0x0063},
{0x004A,0x0082,0x0063},
{0x004A,0x0082,0x0063},
{0x004A,0x0082,0x0063},
{0x004A,0x0082,0x0063},
{0x004A,0x0082,0x0063},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0031},
{0x0063,0x0082,0x0000},
{0x007B,0x0082,0x0000},
{0x007B,0x0082,0x0000},
{0x007B,0x0082,0x0000},
{0x007B,0x0082,0x0000},
{0x007B,0x0082,0x0000},
{0x007B,0x0082,0x0000},
{0x007B,0x0082,0x0000},
{0x007B,0x0082,0x0000},
{0x007B,0x0082,0x0000},
{0x007B,0x0082,0x0000},
{0x007B,0x0082,0x0000},
{0x007B,0x0082,0x0000},
{0x007B,0x0082,0x0000},
{0x0063,0x009A,0x0000},
{0x0063,0x009A,0x0000},
{0x0063,0x009A,0x0000},
{0x0063,0x009A,0x0000},
{0x0063,0x009A,0x0000},
{0x0063,0x009A,0x0000},
{0x0063,0x009A,0x0000},
{0x0063,0x009A,0x0000},
{0x0063,0x009A,0x0000},
{0x004A,0x00B2,0x0000},
{0x004A,0x00B2,0x0000},
{0x004A,0x00B2,0x0000},
{0x004A,0x00B2,0x0000},
{0x004A,0x00B2,0x0000},
{0x004A,0x00B2,0x0000},
{0x0042,0x0041,0x0000},
{0x0042,0x0041,0x0000},
{0x0042,0x0041,0x0000},
{0x0042,0x0041,0x0000},
{0x0042,0x0041,0x0000},
{0x0031,0x004D,0x0000},
{0x0031,0x004D,0x0000},
{0x0031,0x004D,0x0000},
{0x0031,0x004D,0x0000},
{0x0031,0x004D,0x0000},
{0x0031,0x004D,0x0000},
{0x0018,0x0065,0x0000},
{0x0018,0x0065,0x0000},
{0x0018,0x0065,0x0000},
{0x0018,0x0065,0x0000},
{0x0018,0x0065,0x0000},
{0x0018,0x0065,0x0000},
{0x0018,0x0065,0x0000},
{0x0018,0x0065,0x0000},
{0x0018,0x0065,0x0000},
{0x0000,0x007D,0x0000},
{0x0000,0x007D,0x0000},
{0x0000,0x007D,0x0000},
{0x0000,0x007D,0x0000},
{0x0000,0x007D,0x0000},
{0x0000,0x007D,0x0000},
{0x0000,0x007D,0x0000},
{0x0000,0x007D,0x0000},
{0x0000,0x007D,0x0000},
{0x0000,0x0065,0x0000},
{0x0000,0x0065,0x0031},
{0x0000,0x0065,0x0031},
{0x0000,0x0065,0x0031},
{0x0000,0x0065,0x0031},
{0x0000,0x0065,0x0031},
{0x0000,0x0065,0x0031},
{0x0000,0x0065,0x0031},
{0x0000,0x0065,0x0031},
{0x0000,0x0065,0x0031},
{0x0000,0x0065,0x0031},
{0x0000,0x004D,0x0063},
{0x0000,0x004D,0x0063},
{0x0000,0x004D,0x0063},
{0x0000,0x004D,0x0063},
{0x0000,0x004D,0x0063},
{0x0000,0x004D,0x0063},
{0x0000,0x004D,0x0063},
{0x0000,0x0041,0x0084},
{0x0000,0x0041,0x0084},
{0x0000,0x0041,0x0084},
{0x0000,0x0041,0x0084},
{0x0000,0x0041,0x0084},
{0x0000,0x0041,0x0084},
{0x0000,0x0041,0x0084},
{0x0000,0x0030,0x009C},
{0x0000,0x0030,0x009C},
{0x0000,0x0030,0x009C},
{0x0000,0x0030,0x009C},
{0x0000,0x0030,0x009C},
{0x0000,0x0030,0x009C},
{0x0000,0x0018,0x00CE},
{0x0000,0x0018,0x00CE},
{0x0000,0x0018,0x00CE},
{0x0000,0x0018,0x00CE},
{0x0000,0x0018,0x00CE},
{0x0000,0x0018,0x00CE},
{0x0000,0x0018,0x00CE},
{0x0000,0x0018,0x00CE},
{0x0000,0x0018,0x00CE},
{0x0000,0x0018,0x00CE},
{0x0000,0x0018,0x00CE},
{0x0000,0x0000,0x00CE},
{0x0000,0x0000,0x00FF},
{0x0000,0x0000,0x00FF},
{0x0000,0x0000,0x00FF},
{0x0000,0x0000,0x00FF},
 
bmp.PixelFormat:=pf16bit;
以上这句测试通过,另外不管你先前的 bmp是24位的还是32位的;
都可以直接转换...
 
type
Aword = array[0..$1000] of Word ;
Pword = ^Aword ;
var
ScLine : Pword ;
begin
for j:=0 to image1.Picture.height-1 do begin
ScLine := image1.Picture.Bitmap.ScanLine[j] ;
for i:=0 to image1.Picture.width div 16 - 1 do begin
memo1.line.add(inttohex(ScLine^,4)) ;
end ;
end;
 
to 沉静如海
你可以分别看看RGB的值是多少,我看了一下,分别都是一个字节,加起来就是3个字节,所以说还是24位的
因为16位的是RGB一共2字节,
to dongy_143
bmp.PixelFormat:=pf16bit; 这句话后,我试了一下,红色的图片得到的值试00FF
而不是16位图红色的值 F800,是不正确的。

我自己做了一个
for m:=0 to Image1.Picture.Height-1 do
begin
bmpread:='';
strhex:='';
for n:=0 to image1.Picture.Width-1 do
begin
k1:=colortoRGB(image1.Canvas.Pixels[n,m]);
r:=k1 and $0000ff;
b:=(k1 and $ff0000) shr 16;
g:=(k1 and $00ff00) shr 8;
r1:=leftstr(hextobin(inttohex(r,2)),5);
g1:=leftstr(hextobin(inttohex(g,2)),6);
b1:=leftstr(hextobin(inttohex(b,2)),5);
pixel:=bintohex(r1+g1+b1);
bmpread:=bmpread+pixel;
end;
end;
这样得到的就是16位了,
to pascal!
你的方法我还没试,试完了再告诉你。

谢谢大家
 
to pascal!
我试了一下,用红色图,得到值怎么有3个?
00FF,FF00,0000?
 
多人接受答案了。
 
后退
顶部