Форум: "Начинающим";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
ВнизУменьшение разрешения картинки Найти похожие ветки
← →
CheckIT (2007-09-13 14:50) [0]Привет. Вот хочу подгрузить картинку (bmp картинка). Все хорошо делается, только вот не нужна она мне в своем большом разрешение - памяти кушает много. Как ее уменьшить использую код. Спасибо. Жду решений задачи.
← →
Dib@zol © (2007-09-13 14:54) [1]Удалено модератором
← →
clickmaker © (2007-09-13 14:59) [2]
> Как ее уменьшить использую код
TBitmap - 2 штуки. В первый - исходную и StretchDraw на Canvas второго
← →
Dib@zol © (2007-09-13 15:09) [3]> StretchDraw на Canvas второго
StretchDraw вят ли подойдёт из-за своих УЖЖАСНЫХ искажений. Может, Всё-таки ресэмплинг?
http://delphimaster.net/view/8-1188833633/
Воть.
← →
Ega23 © (2007-09-13 15:14) [4]
> StretchDraw вят ли подойдёт из-за своих УЖЖАСНЫХ искажений.
> Может, Всё-таки ресэмплинг?
Зачем? Я тебя уверяю, на эти искажения пользователь не будет обращать внимания. Особенно если ему дать возможность (но только по его желанию) FullSize увидеть.
← →
Вася Правильный (2007-09-13 15:37) [5]чтобы уменьшить, нужно сначала загрузить в исходном виде, а "в своем большом разрешение - памяти кушает много"
круг замкнулся
> Жду решений задачи.
мед да еще и ложкой?
← →
clickmaker © (2007-09-13 15:51) [6]
> [3] Dib@zol © (13.09.07 15:09)
SetStretchBltMode(bmpSmall.Canvas.Handle, HALFTONE);
StretchBlt(bmpSmall.Canvas.Handle, 0, 0, bmpSmall.Width, bmpSmall.Height,
bmpBig.Canvas.Handle, 0, 0, bmpBig.Width, bmpBig.Height, SRCCOPY);
вполне прилично, на глаз нормально
← →
homm © (2007-09-13 16:11) [7]> вполне прилично, на глаз нормально
только не быстро :)
если сжать нужно в 2 ли 4 раза, то могу вечером код дать.
← →
Denis_ © (2007-09-13 17:08) [8]
>
> если сжать нужно в 2 ли 4 раза, то могу вечером код дать.
>
Давайте, как раз понадобилось:))
← →
homm © (2007-09-13 17:45) [9]> Давайте, как раз понадобилось:))
В принципе можешь прям счас содрать с http://homm86.narod.ru/grushcontrols.rar в модуле KOLGRushContrils.pas
А дома есть код для VCL TBitmap. Вечером запостю суда.
← →
homm © (2007-09-14 00:42) [10]Держите патроха :)
var
CPUisMMX: Boolean;
function NewDIBBitmap(Wi, He: DWORD; pf: TPixelFormat): TBitmap;
begin
Result := TBitmap.Create;
Result.PixelFormat := pf;
Result.HandleType := bmDIB;
Result.Width := Wi;
Result.Height := He;
end;
function DIBBits(BMP: TBitmap): Pointer;
var
Section: TDIBSECTION;
begin
BMP.HandleType := bmDIB;
GetObject(BMP.Handle, sizeof(TDIBSECTION), @Section);
Result := Section.dsBm.bmBits;
end;
function ScanLineSize(BMP: TBitmap): Integer;
var
Section: TDIBSECTION;
begin
BMP.HandleType := bmDIB;
GetObject(BMP.Handle, sizeof(TDIBSECTION), @Section);
Result := ((Section.dsBmih.biBitCount * Section.dsBmih.biWidth + 31) shr 3) and $FFFFFFFC;;
end;
procedure BitmapAntialias4X(SrcBitmap, DstBitmap: TBitmap);
type AGRBQuad = array [0..0] of TRGBQuad;
PAGRBQuad = ^AGRBQuad;
var yDest: integer;
xDest: integer;
xSrc: integer;
i: integer;
R: integer;
G: integer;
B: integer;
rowDest: PAGRBQuad;
rowSrc: array [0..3] of PAGRBQuad;
_rowSrc: PAGRBQuad;
SrcBits: DWORD;
DstBits: DWORD;
dHeight: DWORD;
dWidth: DWORD;
Delta: DWORD;
begin
if CPUisMMX then begin
SrcBits := DWORD(DIBBits(SrcBitmap));
DstBits := DWORD(DIBBits(DstBitmap));
dHeight := DstBitmap.Height;
dWidth := DstBitmap.Width;
Delta := ScanLineSize(SrcBitmap);
asm
pushad
mov esi, SrcBits
mov edi, DstBits
//pxor mm2, mm2
db $0f, $ef, $d2
mov eax, dHeight
@LM1: push eax
mov eax, dWidth
@LM2: /////////
mov ecx, esi
//movd mm1, [ecx]
db $0f, $6e, $09
//punpcklbw mm1, mm2
db $0f, $60, $ca
//movd mm3, [ecx+4]
db $0f, $6e, $59, $04
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
//movd mm3, [ecx+8]
db $0f, $6e, $59, $08
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
//movd mm3, [ecx+12]
db $0f, $6e, $59, $0c
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
add ecx, Delta
//movd mm3, [ecx]
db $0f, $6e, $19
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
//movd mm3, [ecx+4]
db $0f, $6e, $59, $04
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
//movd mm3, [ecx+8]
db $0f, $6e, $59, $08
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
//movd mm3, [ecx+12]
db $0f, $6e, $59, $0c
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
add ecx, Delta
//movd mm3, [ecx]
db $0f, $6e, $19
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
//movd mm3, [ecx+4]
db $0f, $6e, $59, $04
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
//movd mm3, [ecx+8]
db $0f, $6e, $59, $08
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
//movd mm3, [ecx+12]
db $0f, $6e, $59, $0c
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
add ecx, Delta
//movd mm3, [ecx]
db $0f, $6e, $19
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
//movd mm3, [ecx+4]
db $0f, $6e, $59, $04
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
//movd mm3, [ecx+8]
db $0f, $6e, $59, $08
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
//movd mm3, [ecx+12]
db $0f, $6e, $59, $0c
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
//psrlw mm1, 4
db $0f, $71, $d1, $04
//packuswb mm1, mm2
db $0f, $67, $ca
//movd [edi], mm1
db $0f, $7e, $0f
/////////
add edi, 4
add esi, 16
sub eax, 1
jnz @LM2
mov ecx, Delta
lea esi, [esi + ecx*2]
add esi, ecx
pop eax
sub eax, 1
jnz @LM1
//emms
db $0f, $77
popad
end;
end else
for yDest := 0 to DstBitmap.Height -1 do begin
rowDest := DstBitmap.ScanLine[yDest];
for i := 0 to 3 do
rowSrc[i] := SrcBitmap.ScanLine[yDest*4+i];
for xDest := 0 to DstBitmap.Width-1 do begin
xSrc := xDest*4;
R:=0; G:=0; B:=0;
for i := 0 to 3 do begin
_rowSrc := rowSrc[i];
R:= R+_rowSrc[xSrc+0].rgbRed
+ _rowSrc[xSrc+1].rgbRed
+ _rowSrc[xSrc+2].rgbRed
+ _rowSrc[xSrc+3].rgbRed;
G:= G+_rowSrc[xSrc+0].rgbGreen
+ _rowSrc[xSrc+1].rgbGreen
+ _rowSrc[xSrc+2].rgbGreen
+ _rowSrc[xSrc+3].rgbGreen;
B:= B+_rowSrc[xSrc+0].rgbBlue
+ _rowSrc[xSrc+1].rgbBlue
+ _rowSrc[xSrc+2].rgbBlue
+ _rowSrc[xSrc+3].rgbBlue;
end;
DWORD(rowDest[xDest]) := ((R and $0ff0) shl 12) or ((G and $0ff0) shl 4) or (B shr 4);
end;
end;
end;
← →
homm © (2007-09-14 00:43) [11]И еше.
procedure BitmapAntialias2X(SrcBitmap, DstBitmap: TBitmap);
type AGRBQuad = array [0..0] of TRGBQuad;
PAGRBQuad = ^AGRBQuad;
var yDest: integer;
xDest: integer;
xSrc: integer;
i: integer;
R: integer;
G: integer;
B: integer;
rowDest: PAGRBQuad;
rowSrc: array [0..3] of PAGRBQuad;
_rowSrc: PAGRBQuad;
SrcBits: DWORD;
DstBits: DWORD;
dHeight: DWORD;
dWidth: DWORD;
Delta: DWORD;
begin
if CPUisMMX then begin
SrcBits := DWORD(DIBBits(SrcBitmap));
DstBits := DWORD(DIBBits(DstBitmap));
dHeight := DstBitmap.Height;
dWidth := DstBitmap.Width;
Delta := ScanLineSize(SrcBitmap);
asm
pushad
mov esi, SrcBits
mov edi, DstBits
//pxor mm2, mm2
db $0f, $ef, $d2
mov eax, dHeight
@LM1: push eax
mov eax, dWidth
@LM2: /////////
mov ecx, esi
//movd mm1, [ecx]
db $0f, $6e, $09
//punpcklbw mm1, mm2
db $0f, $60, $ca
//movd mm3, [ecx+4]
db $0f, $6e, $59, $04
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
add ecx, Delta
//movd mm3, [ecx]
db $0f, $6e, $19
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
//movd mm3, [ecx+4]
db $0f, $6e, $59, $04
//punpcklbw mm3, mm2
db $0f, $60, $da
//paddusw mm1, mm3
db $0f, $dd, $cb
//psrlw mm1, 2
db $0f, $71, $d1, $02
//packuswb mm1, mm2
db $0f, $67, $ca
//movd [edi], mm1
db $0f, $7e, $0f
/////////
add edi, 4
add esi, 8
sub eax, 1
jnz @LM2
add esi, Delta
pop eax
sub eax, 1
jnz @LM1
//emms
db $0f, $77
popad
end;
end else
for yDest := 0 to DstBitmap.Height -1 do begin
rowDest := DstBitmap.ScanLine[yDest];
for i := 0 to 1 do
rowSrc[i] := SrcBitmap.ScanLine[yDest*2+i];
for xDest := 0 to DstBitmap.Width-1 do begin
xSrc := xDest*2;
R:=0; G:=0; B:=0;
for i := 0 to 1 do begin
_rowSrc := rowSrc[i];
R:= R+_rowSrc[xSrc+0].rgbRed
+ _rowSrc[xSrc+1].rgbRed;
G:= G+_rowSrc[xSrc+0].rgbGreen
+ _rowSrc[xSrc+1].rgbGreen;
B:= B+_rowSrc[xSrc+0].rgbBlue
+ _rowSrc[xSrc+1].rgbBlue;
end;
DWORD(rowDest[xDest]) := ((R and $03fc) shl 14) or ((G and $03fc) shl 6) or (B shr 2);
end;
end;
end;
procedure BlendBitmaps(var DestBitmap, FromBitmap, ToBitmap: TBitmap; Factor: Integer;
ClipRect:TRect);
type AGRBQuad = array [0..0] of TRGBQuad;
PAGRBQuad = ^AGRBQuad;
var Factor2: byte;
i, j: integer;
DestRow: PAGRBQuad;
FromRow: PAGRBQuad;
ToRow: PAGRBQuad;
FromDibBits: DWORD;
ToDibBits: DWORD;
DestDibBits: DWORD;
_Width: integer;
_Height: integer;
_Right: integer;
_Top: DWORD;
begin
if CPUisMMX then begin
_Top := FromBitmap.Width * 4 * ClipRect.Top + ClipRect.Left * 4;
FromDibBits := DWORD(DIBBits(FromBitmap)) + _Top;
ToDibBits := DWORD(DIBBits(ToBitmap)) + _Top;
DestDibBits := DWORD(DIBBits(DestBitmap)) + _Top;
_Width := ClipRect.Right - ClipRect.Left;
_Height := ClipRect.Bottom - ClipRect.Top;
_Right := (FromBitmap.Width - ClipRect.Right + ClipRect.Left) * 4;
asm
mov edx, Factor
mov dh, dl
mov ax, dx
shl eax, 16
mov ax, dx
mov esi, FromDibBits
mov edi, ToDibBits
mov edx, DestDibBits
//pxor mm2, mm2
db $0f, $ef, $d2
//movd mm3, eax
db $0f, $6e, $d8
//punpcklbw mm3, mm2
db $0f, $60, $da
mov eax, $00404040
//movd mm4, eax
db $0f, $6e, $e0
//punpcklbw mm4, mm2
db $0f, $60, $e2
//psubw mm4, mm3
db $0f, $f9, $e3
mov ecx, _Height
@LM1:
mov ebx, _Width
@LM2:
//movd mm0, [esi]
db $0f, $6e, $06
//movd mm1, [edi]
db $0f, $6e, $0f
//punpcklbw mm0, mm2
db $0f, $60, $c2
//punpcklbw mm1, mm2
db $0f, $60, $ca
//pmullw mm0, mm4
db $0f, $d5, $c4
//pmullw mm1, mm3
db $0f, $d5, $cb
//paddusw mm1, mm0
db $0f, $dd, $c8
//psrlw mm1, 6
db $0f, $71, $d1, $06
//packuswb mm1, mm2
db $0f, $67, $ca
//movd [edx], mm1
db $0f, $7e, $0a
add esi, 4
add edi, 4
add edx, 4
sub ebx, 1
jnz @LM2
add esi, _Right
add edi, _Right
add edx, _Right
sub ecx, 1
jnz @LM1
//emms
db $0f, $77
end
end else begin
Factor2 := 64-Factor;
for i := ClipRect.Top to ClipRect.Bottom-1 do begin
DestRow := DestBitmap.ScanLine[i];
FromRow := FromBitmap.ScanLine[i];
ToRow := ToBitmap.ScanLine[i];
for j := ClipRect.Left to (ClipRect.Right-1) do begin
DestRow[j].rgbBlue := ((FromRow[j].rgbBlue*Factor2)
+ (ToRow[j].rgbBlue*Factor)) shr 6;
DestRow[j].rgbGreen := ((FromRow[j].rgbGreen*Factor2)
+ (ToRow[j].rgbGreen*Factor)) shr 6;
DestRow[j].rgbRed := ((FromRow[j].rgbRed*Factor2)
+ (ToRow[j].rgbRed*Factor)) shr 6;
end;
end;
end;
end;
initialization
CPUisMMX := isMMX();
← →
homm © (2007-09-14 00:52) [12]Тут даже еше бонус-функция, BlendBitmaps, для смешивания 2-х картинок;
Пару слов о том, как пользоваться:
Все 3 фунции (BitmapAntialias2X, BitmapAntialias4X, BlendBitmaps) принимают в параметрах уже созданые TBitmap"ы с правильной вириной и высотой в формате pf32bit, никаких проверок внутри функций нет; Проще всего получить такие с помошью функции NewDIBBitmap(Wi, He, pf32bit);
Функция BlendBitmaps 4-м параметром принимает число от 0 до 63. 0 - по сути копирование FromBitmap, 63 - ToBitmap (или наоборот);
← →
Германн © (2007-09-14 00:58) [13]
> А дома есть код для VCL TBitmap. Вечером запостю суда.
>
Эээ. В Челябинске уже вечер???
:-)
← →
homm © (2007-09-14 01:00) [14]> [13] Германн © (14.09.07 00:58)
> Эээ. В Челябинске уже вечер???
3 часа ночи. :) До этого проблемы были с инетом.
← →
Германн © (2007-09-14 01:08) [15]
> 3 часа ночи. :) До этого проблемы были с инетом.
>
День Программиста, блин :-)
← →
FreeTT (2007-09-14 08:56) [16]А можно сжать до нужного размера, скажем есть у меня картинка 1280 на 840. А мне нужен bmp файл размером 100 на 100. Мастера, есть варианты?
← →
Вася Правильный (2007-09-14 10:52) [17]
> у меня картинка 1280 на 840. А мне нужен bmp файл размером 100 на 100.
с деформацией?
← →
FreeTT (2007-09-14 13:56) [18]Мне не важна четкость картинки, мне важен ее силуэт, т.е. в очертаниях понятно, что на ней нарисовано. А потом тут и так понятно, что ее качество ухудшится очень сильно =).
← →
homm © (2007-09-14 14:02) [19]> Мне не важна четкость картинки, мне важен ее силуэт, т.е.
> в очертаниях понятно, что на ней нарисовано.
Дак это… было же
[2] clickmaker ©
← →
Denis_ © (2007-09-14 17:23) [20]
> homm ©
Даа... Сильно!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.064 c