利用编程的方式实现--只改变图片的打印大小,--而不改变图片的像素大小。(图片只限于jpg格式)(100分)

  • 主题发起人 主题发起人 fphuang
  • 开始时间 开始时间
F

fphuang

Unregistered / Unconfirmed
GUEST, unregistred user!
如题!
谢谢各位兄弟帮忙!
 
图片的缩放
procedure TForm1.Button1Click(Sender: TObject);
var
b: TBitmap;//原图片
nb: TBitmap;//Resize以后的图片
r: TRect;
begin
b := TBitmap.Create;
if OpenDialog1.Execute then
begin
b.LoadFromFile(OpenDialog1.FileName);
nb := TBitmap.Create;

//你可以自己定义高度和宽度,这里是都变成一半
nb.Height := b.Height div 2; //高度变为原来的一半
nb.Width := b.Width div 2; //宽度变为原来的一半
r.TopLeft := Point(0, 0);
r.BottomRight := Point(nb.Width, nb.Height);

with nb.Canvas do
begin
Pen.Style := psDash;
Brush.Style := bsClear;
Rectangle(0, 0, nb.Width, nb.Height);
StretchDraw(r, TGraphic(b));
end;
if SaveDialog1.Execute then nb.SaveToFile(SaveDialog1.FileName);//这句不要,不存回去
nb.Free;
end;
b.Free;
end;
试试看
 
to app2001 谢谢您,但不行啊,我试验过了,大小是可以改变,但是图片的像素也便小了,我想实现的是像Photoshop中那样只改变图片的打印尺寸,而图片的像素不便,比方说:原来的像素大小是1024*768的,打印尺寸为6*8的,此时的图象的分辨率为72;经过改变后,像素大小还是1024*768的,打印尺寸为3.6*4.8的,此时的图象的分辨率随之变大400。
 
用矢量图就可以了例如:*.wmf,*.dxf等。
 
to 李翔鹏 只限jpg格式图片的,是数码相机中的照片
 
你只是让人看的,有什么关系呢?
 
如果只是让别人在计算机中看就没有必要这么麻烦了,因为在计算机当中分辨率是72就完全可以了,但是需要将处理完的这些图片(是批量处理)拿到图片社给冲洗出照片来。但是在冲洗照片的时候分辨率如果是72,在照片中就会出现马赛克了。
 
哦,这个的话,PHOTHSHOW里似乎是一种补偿方式的添加相近颜色进去的吧?这方面我也不太清楚了,你可以到下面这个网站上看看去,看人家那里有没有你想要的
http://asp.6to23.com/iseesoft/
 
这个你再看看对你有没有用吧
用Delphi读取JPEG文件的缩览图
--------------------------------------------------------------------------------
  JPEG图像文件以高压缩比和高图像质量著称,市面上的图库光盘中的图像文件大都是JPEG格式的。怎样从一大堆JPEG文件中查找合适的图像呢?使用JPEG文件的缩览图就是其中方法之一。
  在PhotoShop 4.0(或以上版本)的打开文件对话框中,当打开JPEG文件时,PhotoShop很快把它的缩览图显示出来。为什么PhotoShop能这么快地显示出JPEG文件的缩览图呢?
  原来PhotoShop在保存JPEG文件时把它的缩览图也保存在文件里。PhotoShop定义了新的段FF ED,这个段保存了一个JPEG文件格式的缩览图,大图中有小图。FF ED段后两个字节是这个段的长度,在这个段里有缩览图的开始标志FF D8和结束标志FF D9,将这个段拷贝出来即可获得该图的缩览图。值得注意的是PhotoShop 4.0解出的缩览图,像素格式不是常规的RGB,而是BGR格式,所以还得加入BGR转为RGB的代码,转化过程是在内存里把B和R的位置交换。
  下面是Delphi编写的快速读取PhotoShop 4.0(或以上版本)JPEG文件的缩览图的程序,程序用TFileStream读取JPEG文件的FF ED段,结合TmemoryStream、TJPEGimage, 返回BMP格式的缩览图。
  function LoadThumb(filename:shortstring):TBitmap;
  procedure BGR2RGB(var bmp:TBitmap);
  var
  x,y:integer; t:char; data:pchar;
  begin
  for y:=bmp.Height-1 downto 0 do
  begin
  data:=bmp.ScanLine[y];
  for x:=0 to bmp.Width-1 do
  begin
  t:=data[x*3];
  data[x*3]:=data[x*3+2];
  data[x*3+2]:=t;
  end;
  end;
  end;
  var
  fstream:Tfilestream; mstream:Tmemorystream;
  j,i:word;data:pchar; buf:array [0..3] of byte;
  filesize:DWORD; fjpg:Tjpegimage;bmp:Tbitmap;
  begin
  result:=nil;
  fstream:=Tfilestream.create(filename,fmOpenRead);
  //建立文件流,读JPEG文件
  fstream.Seek(20,soFromBeginning); //FF ED段在文件的第20个字节处
  fstream.Read(buf,sizeof(buf));
  if PWORD(@buf[0])^=$EDFF then
  begin
  j:=buf[2]*256+buf[3]; //FF ED的大小,高位在前,低位在后
  if j<1024 then //FF ED段的大小若为1024个字节则文件不包含缩览图,退出程序
  begin
  fstream.free;
  exit;
  end;
  mstream:=TMemorystream.Create;//建立内存流
  mstream.CopyFrom(fstream,j); //把FF ED段拷贝到mstream
  data:=mstream.Memory;
  for i:=300 to 700 do //找缩览图的开始标志FF D8
  if PWORD(@data)^=$D8FF then break;
  if i<700 then
  begin
  fjpg:=Tjpegimage.Create; //建立TJPEGimage 解出缩览图
  bmp:=TBitmap.Create;
  mstream.Position:=i;
  fjpg.LoadFromStream(mstream);//fjpg读取mstream
  bmp.Assign(fjpg); //JPEG转BMP
  if PWORD(@data[i+57])^=$2e34 then //PhotoShop 4.0的缩览图
  BGR2RGB(bmp); //BMP的像素格式BGR 而不是RGB,要把BGR转化为RGB
  result:=bmp; //函数返回BMP
  mstream.Free;
  fjpg.Free; //释放Object
  end;end;
  fstream.free;
  end;
  可直接把Delphi 的Timage可视控件拖到Form上,用image.picture.bitmap:= LoadThumb(filename) 即可显示PhotoShop JPEG文件的缩览图。
 
to app2001
还是要谢谢您帮助!
 
问题没完,希望各位 继续
 
接受答案了.
 

Similar threads

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