请问如何将jpeg图像缩小保存(包括尺寸和质量) 如题,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 int __fastcall TForm1::Stretch_Linear(Graphics::TBitmap *aDest, Graphics::TBitmap *aSrc){ int sw = aSrc->Width - 1, sh = aSrc->Height - 1, dw = aDest->Width - 1, dh = aDest->Height - 1; int B, N, x, y; int nPixelSize = GetPixelSize(aDest, aDest->PixelFormat); if (nPixelSize == -1 ) { return -1; // unsupport } BYTE * pLinePrev, *pLineNext; BYTE * pDest; BYTE * pA, *pB, *pC, *pD; for ( int i = 0; i <= dh; ++i ) { pDest = ( BYTE * )aDest->ScanLine[i]; y = i * sh / dh; N = dh - i * sh % dh; pLinePrev = ( BYTE * )aSrc->ScanLine[y++]; pLineNext = ( N == dh ) ? pLinePrev : ( BYTE * )aSrc->ScanLine[y]; for ( int j = 0; j <= dw; ++j ) { x = j * sw / dw * nPixelSize; B = dw - j * sw % dw; pA = pLinePrev + x; pB = pA + nPixelSize; pC = pLineNext + x; pD = pC + nPixelSize; if ( B == dw ) { pB = pA; pD = pC; } for ( int k = 0; k < nPixelSize; ++k ) { *pDest++ = ( BYTE )( int )( ( B * N * ( *pA++ - *pB - *pC + *pD ) + dw * N * *pB++ + dh * B * *pC++ + ( dw * dh - dh * B - dw * N ) * *pD++ + dw * dh / 2 ) / ( dw * dh ) ); } } } return 0;}//---------------------------------------------------------------------------int __fastcall TForm1::GetPixelSize( Graphics::TBitmap *abmp, TPixelFormat fmt ){ int nBitCount, nMultiplier; int BitsPerByte = 8; nMultiplier = -1; switch(fmt) { case pfDevice: { nBitCount = GetDeviceCaps(abmp->Canvas->Handle, BITSPIXEL); nMultiplier = nBitCount / BitsPerByte; if (nBitCount % BitsPerByte > 0 ) { nMultiplier += 1; } } break; case pf1bit: nMultiplier = 1; break; case pf4bit: nMultiplier = 1; break; case pf8bit: nMultiplier = 1; break; case pf15bit: nMultiplier = 2; break; case pf16bit: nMultiplier = 2; break; case pf24bit: nMultiplier = 3; break; case pf32bit: nMultiplier = 4; break; default: return -1; } return nMultiplier;} JPEG-->BMP-->Stretch_Linear()->BMP->SAVETOJPEG to : leoneo_zhang(木牛流马) 先谢谢回答,但我要的是delphi的方法啊! var h,w:integer; bmp: TBitmap; MyJpg:TJPEGImage;begin MyJpg := TJPEGImage.Create; bmp:= TBitmap.Create; Image1.Picture.LoadFromFile('c:\in.jpg'); with bmp do begin h:=Round(image1.Picture.Metafile.Height*0.8);//缩放比例0.8 w:=Round(image1.Picture.Metafile.Width*0.8); Height:=h; Width:=w; Canvas.StretchDraw(Rect(0,0,w,h),image1.Picture.Metafile); end; MyJpg.Assign(bmp); MyJpg.CompressionQuality:=90;//JPG图片质量0-100 MyJpg.Compress; MyJpg.SaveToFile('c:\out.jpg'); bmp.free; MyJpg.free;end; fastreport中,如何在用程序指定横向打印,或纵向打印 的问题 delphi中Lcdscreen控件 一简单的数据录入问题 模式窗口打开导致线程挂起问题 如何调用系统的netmeeting 和 mediaplay?? 关于显视问题 用MSCOMM控件接收来电信息的问题!!! 装了Delphi7后怎么系统命令失灵了?? filter问题 我想要下载一个DELPHI6的安装包,不知要到哪里找 知道一个二次函数如何得出它的函数图? 安装程序的制作
{
int sw = aSrc->Width - 1, sh = aSrc->Height - 1,
dw = aDest->Width - 1, dh = aDest->Height - 1; int B, N, x, y; int nPixelSize = GetPixelSize(aDest, aDest->PixelFormat);
if (nPixelSize == -1 ) {
return -1; // unsupport
} BYTE * pLinePrev, *pLineNext;
BYTE * pDest;
BYTE * pA, *pB, *pC, *pD; for ( int i = 0; i <= dh; ++i )
{
pDest = ( BYTE * )aDest->ScanLine[i];
y = i * sh / dh;
N = dh - i * sh % dh;
pLinePrev = ( BYTE * )aSrc->ScanLine[y++];
pLineNext = ( N == dh ) ? pLinePrev : ( BYTE * )aSrc->ScanLine[y];
for ( int j = 0; j <= dw; ++j )
{
x = j * sw / dw * nPixelSize;
B = dw - j * sw % dw;
pA = pLinePrev + x;
pB = pA + nPixelSize;
pC = pLineNext + x;
pD = pC + nPixelSize; if ( B == dw )
{
pB = pA;
pD = pC;
} for ( int k = 0; k < nPixelSize; ++k )
{
*pDest++ = ( BYTE )( int )(
( B * N * ( *pA++ - *pB - *pC + *pD ) + dw * N * *pB++
+ dh * B * *pC++ + ( dw * dh - dh * B - dw * N ) * *pD++
+ dw * dh / 2 ) / ( dw * dh )
);
}
}
}
return 0;
}//---------------------------------------------------------------------------int __fastcall TForm1::GetPixelSize( Graphics::TBitmap *abmp, TPixelFormat fmt )
{ int nBitCount, nMultiplier;
int BitsPerByte = 8; nMultiplier = -1;
switch(fmt)
{
case pfDevice:
{
nBitCount = GetDeviceCaps(abmp->Canvas->Handle, BITSPIXEL);
nMultiplier = nBitCount / BitsPerByte;
if (nBitCount % BitsPerByte > 0 )
{
nMultiplier += 1;
}
}
break;
case pf1bit: nMultiplier = 1; break;
case pf4bit: nMultiplier = 1; break;
case pf8bit: nMultiplier = 1; break;
case pf15bit: nMultiplier = 2; break;
case pf16bit: nMultiplier = 2; break;
case pf24bit: nMultiplier = 3; break;
case pf32bit: nMultiplier = 4; break;
default:
return -1;
}
return nMultiplier;
}
h,w:integer;
bmp: TBitmap;
MyJpg:TJPEGImage;
begin
MyJpg := TJPEGImage.Create;
bmp:= TBitmap.Create;
Image1.Picture.LoadFromFile('c:\in.jpg');
with bmp do
begin
h:=Round(image1.Picture.Metafile.Height*0.8);//缩放比例0.8
w:=Round(image1.Picture.Metafile.Width*0.8);
Height:=h;
Width:=w;
Canvas.StretchDraw(Rect(0,0,w,h),image1.Picture.Metafile);
end;
MyJpg.Assign(bmp);
MyJpg.CompressionQuality:=90;//JPG图片质量0-100
MyJpg.Compress;
MyJpg.SaveToFile('c:\out.jpg');
bmp.free;
MyJpg.free;
end;