Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.14;
Скачать: CL | DM;

Вниз

Уменьшение разрешения картинки   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.024 c
15-1189680539
Synset
2007-09-13 14:48
2007.10.14
СГУ и ДПС


2-1189746770
APXi
2007-09-14 09:12
2007.10.14
Как определить какая форма активна, если все формы внедрены?


2-1189666338
muhsin2281
2007-09-13 10:52
2007.10.14
rtl70.bpl vcl70.bpl не найден


2-1190115937
F@T@L_Err0r
2007-09-18 15:45
2007.10.14
MediaPlayer


2-1190221258
Jimmy
2007-09-19 21:00
2007.10.14
Имплонтация мультимедийного таймера в свой компонент