如何实现Image控件中的JPG图片的旋转,以前的scanline方法都是用于bmp的。有没有专用于jpg的算法 ( 积分: 50 )

  • 主题发起人 主题发起人 coolstar1204
  • 开始时间 开始时间
C

coolstar1204

Unregistered / Unconfirmed
GUEST, unregistred user!
看了几个原来的贴子,里面的代码对于image控件装入bitmap类型图是有效的。
一放上jpg图就不起作用。。。
 
看了几个原来的贴子,里面的代码对于image控件装入bitmap类型图是有效的。
一放上jpg图就不起作用。。。
 
对于JPEG的90/180旋转,上下/左右翻转,可以做到无损失.其他的角度都必须要先解码成DIB(BMP),然后才能旋转.因此你直接Draw一下,然后再转换存储为JPEG即可.GDI+中有现成的冬冬可以使用.
 
楼上的能不能说说无损的90/180旋转具体实现
 
垂直反转原理:
ScanLine原始bitmap第0行作为新bitmap的最后一行(也就是第Height-1行),该行上的列保持不变
ScanLine原始bitmap第1行作为新bitmap的Height-2行),该行上的列保持不变

........
ScanLine原始bitmap第Height-1行作为新bitmap的第0行),该行上的列保持不变


水平反转原理:
ScanLine原始Bitmap的每一行,
其第Width-1列作为新Bitmap的第0列,第Width-2列作为新bitmap第1列..........第0列作为新bitmap的第width-1列


顺时针/逆时针的90度翻转稍复杂一点,建议在网上找一下DELPHI数字图像处理这本书的附盘(好像Delphifan里有,具体忘了),里面有很详细的例子。
 
谢谢楼上的.我去看看
 
var
Form1: TForm1;
const
MaxPixelCount = 32768;

type
PRGBArray = ^TRGBArray;
TRGBArray = array[0..MaxPixelCount - 1] of TRGBTriple;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
//b1,b2,b4:pbytearray;
b1,b2:prgbarray;
i,j:integer;
bmp:tbitmap;
begin

bmp:=tbitmap.create;
bmp.width:=image1.Height;
bmp.height:=image1.width;
image1.picture.bitmap.PixelFormat:=pf24bit;
bmp.PixelFormat:=pf24bit;
for j:=0 to image1.height-1 do
begin
b1:=image1.picture.Bitmap.ScanLine[j];
// b2:=bmp.ScanLine[j];
for i:=0 to image1.width-1 do
begin
b2:=bmp.ScanLine;
b2[j]:=b1;
//pRGBArray(bmp.ScanLine[image1.Width - i - 1])[j] := b1;
end;
end;
image1.picture.bitmap:=bmp;
bmp.free
end;
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;

procedure TForm1.Button2Click(Sender: TObject);
begin
image1.picture.bitmap.PixelFormat :=pf24bit;
rotate90(image1.picture.Bitmap);

end;

end.
 
把jpg转成bmp,翻转以后再转回来

ScanLine就是操作bitmap里面的那个数组
 
龙飞凤舞316 的方法一,按钮一的方法最好,比用pixel的方法快好多.分一定给你.这就结帐
 
多人接受答案了。
 
后退
顶部