怎样把jpeg图片旋转90度?Delphi 编程实现。 ( 积分: 100 )

  • 主题发起人 主题发起人 lbzlby
  • 开始时间 开始时间
L

lbzlby

Unregistered / Unconfirmed
GUEST, unregistred user!
我想打印一张图片,图片是jpg的,需要旋转90度,这样节省像纸,怎样实现呢?需要转换为bmp的吗?
 
我想打印一张图片,图片是jpg的,需要旋转90度,这样节省像纸,怎样实现呢?需要转换为bmp的吗?
 
用画图板打开,里面有旋转的工具,弄好之后保存就OK了,呵呵
 
这也叫答案吗?不要乱说呀。我是要做程序。
 
你把打印设置成横向打印也可以啊
 
用word旋转然后打印啊
 
以前的笔记,偶也忘了从哪里抄来的了,呵呵


// ****************************************************************************
// 顺时针旋转90度
// 参数:
// bmp 输入Bitmap
// bmpOut 输出Bitmap
// 返回值:
// 成功 True
// 失败 False
// ****************************************************************************
function Rotate90(bmp:TBitmap;var bmpOut:TBitmap):boolean;
var
aStream: TMemorystream; //内存流
header: TBITMAPINFO;
dc: hDC;
P: ^THelpRGB;
x, y, b, h: Integer;
RowOut: pRGBArray;
begin
try
//创建内存流
aStream := TMemoryStream.Create;
//设置大小,必须是4的倍数
aStream.SetSize(bmp.Height * bmp.Width * 4);
with header.bmiHeader do //操作位图文件
begin
biSize := SizeOf(TBITMAPINFOHEADER); //大小
biWidth := bmp.Width; //位图宽
biHeight := bmp.Height; //位图高
biPlanes := 1;
biBitCount := 32;
//无压缩
biCompression := 0;
biSizeimage := aStream.Size;
biXPelsPerMeter := 1; //水平分辨率
biYPelsPerMeter := 1; //竖直分辨率
biClrUsed := 0;
biClrImportant := 0;
end;
dc := GetDC(0);
P := aStream.Memory;
GetDIBits(dc, bmp.Handle, 0, bmp.Height, P, header, dib_RGB_Colors);
ReleaseDC(0, dc);
b := bmp.Height; //源图高
h := bmp.Width; //源图宽
//指定要创建的位图的大小尺寸
bmp.Width := b;
bmp.height := h;
for y := 0 to (h - 1) do
begin
rowOut := bmp.ScanLine[y]; //获取新的位图信息
P := aStream.Memory; //设置文件指针
inc(p, y); //指针移位
for x := 0 to (b - 1) do
begin
rowout[x] := p^.rgb; //进行数据转移
inc(p, h);
end;
end;
aStream.Free; //释放资源

bmpOut.Width := bmp.Width;
bmpOut.Height := bmp.Height;
bmpOut.Assign(bmp);
result := true;
except
Result := false;
end;
end;
 
有一个控件,你搜一下吧有的是
 
矩阵旋转一下图片数据就OK了,楼上说的那个控件名称叫TRotateGraphic(或者TRotatePicture),在Delphi盒子里面就有
 
你的问题是:
怎么节省像纸。(而不是怎么旋转90度)
答案是:
1. 你的打印机是不是可以调整方向?(现在我还没有见过可以调整方向大打印机)
这样呢可以根据图片的 “形状” 来调整打印机的方向,下一步,调整你的图片的大小,适应相纸的大小(就是打印机 print.canvas.clipRect),最后用 print.canvas.clipRect。draw(0, 0, Graphic)。

2. 就是你用了上面的旋转到代码,也不能达到 目的,因为每张相片的大小,方向可以不同,必须根据相片的尺寸来调整,当然,你不想改变打印机的方向,就旋转下也可以,旋转后在调整图片的大小。
 
旋转90度的精简,快速代码
FUNCTION Rotate90(Bitmap:TBitmap): TBitmap;
VAR i,j : INTEGER;
rowIn : pRGBArray;
BEGIN
IF Bitmap.PixelFormat <> pf24bit then
exit;

RESULT := TBitmap.Create;
RESULT.Width := Bitmap.Height;
RESULT.Height := Bitmap.Width;
RESULT.PixelFormat := Bitmap.PixelFormat; // only pf24bit for now

// Out[j, Right - i - 1] = In[i, j]
FOR j := 0 TO Bitmap.Height - 1 DO BEGIN
rowIn := Bitmap.ScanLine[j];
FOR i := 0 TO Bitmap.Width - 1 DO
pRGBArray(RESULT.ScanLine[Bitmap.Width - i - 1])[j] := rowIn
END;
END;
 
后退
顶部