Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.55 MB
Время: 0.042 c
3-1181296206
MZ
2007-06-08 13:50
2007.10.14
Триггер или COUNT?


2-1190010340
alshtam
2007-09-17 10:25
2007.10.14
Tstring list


15-1189970382
ProgRAMmer Dimonych
2007-09-16 23:19
2007.10.14
Посоветуйте, что делать


3-1181297041
ValeXandr
2007-06-08 14:04
2007.10.14
Работа с QReport


2-1190358163
Леван Варшанидзе
2007-09-21 11:02
2007.10.14
Как узнать IP аддресс текущего интернет-подключения?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский