Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2013, 19:21   #1
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию Как изменить CopyPNG (внутри), чтобы она соответствовала Canvas.CopyRect?

Как изменить CopyPNG (внутри), чтобы она соответствовала Canvas.CopyRect?
Действует нормально, только если исходный регион равен назначаемому.
Код:
procedure CopyPNG(const PNGfrom, PNGto: TPNGObject; const Rfrom, Rto: TRect);
Var
  i, j: integer;
Begin
    BitBlt(pngto.Canvas.Handle, Rto.Left, Rto.Top, Rfrom.Width, Rfrom.Height,
        PNGfrom.Canvas.Handle, Rfrom.Left, Rfrom.Top, SRCCOPY);
    For i:=0 to rfrom.Height-1 do
      CopyMemory(pByte(dword(pngto.AlphaScanline[i+Rto.Top])+Rto.Left),
        pByte(dword(pngfrom.AlphaScanline[i+Rfrom.Top])+Rfrom.Left),
          Rfrom.Width);
End;
Вообщем, для копирования регионов с Tbitmap использовал (чтоб растянуть изображение-кнопку не портя углы):
Код:
    png.Canvas.CopyRect(rect(0,0,n,n), pngbuf.Canvas, rect(0,0,n,n));
    png.Canvas.CopyRect(rect(n,0,width-n,n), pngbuf.Canvas, rect(n,0,n+1,n));
    png.Canvas.CopyRect(rect(width-n,0,width,n), pngbuf.Canvas, rect(n+1,0,n*2,n));

    png.Canvas.CopyRect(rect(0,n,n,height-n), pngbuf.Canvas, rect(0,n,n,n+1));
    png.Canvas.CopyRect(rect(n,n,width-n,height-n), pngbuf.Canvas, rect(n,n,n+1,n+1));
    png.Canvas.CopyRect(rect(width-n,n,width,height-n), pngbuf.Canvas, rect(n+1,n,n*2+1,n+1));

    png.Canvas.CopyRect(rect(0,height-n,n,height), pngbuf.Canvas, rect(0,n+1,n,n*2));
    png.Canvas.CopyRect(rect(n,height-n,width-n,height), pngbuf.Canvas, rect(n,n+1,n+1,n*2+1));
    png.Canvas.CopyRect(rect(width-(n),height-(n),width,height), pngbuf.Canvas, rect(n+1,n+1,n*2+1,n*2+1));
Код работал на ура, а вот с png надо копировать часть за частью. Притом растягивая, чтоб получалось "112233"->"111222333".
Т.е. из:

123
456
789

это:

112233
112233
445566
445566
778899
778899

Как это реализовать?
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 17.04.2013, 00:50   #2
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Конкретнее, надо чтоб массив (хз чего) растягивался подобно:

Если регион назначения меньше то:

Если регион назначения больше то:

Причем, если регион назначения больше только в какую то одну сторону, а в другую сторону меньше, то и растягивалось в процентном соотношении.
P.S.: сглаживание мне не нужно (ФШ сгладил).
Пожалуйста, помогите.
Изображения
Тип файла: png 111.png (2.8 Кб, 52 просмотров)
Тип файла: png 112.png (3.6 Кб, 54 просмотров)
Тип файла: png 113.png (2.9 Кб, 60 просмотров)
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 17.04.2013, 02:01   #3
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Пока нашел временное решение, углы - равные по размерности, в центре 1 пиксель, заполняющий кнопку полностью.
Код:
procedure CopyPNG(const PNGfrom, PNGto: TPNGimage; const Rfrom, Rto: TRect);
Var  arrbuf:array[0..100,0..100]of dword;
  i, j: integer;
Begin
  if (rto.Width>rfrom.Width)and(rto.Height=rfrom.Height) then
  begin
    for j:=0 to rto.width-rfrom.width do
    begin
      BitBlt(pngto.Canvas.Handle, Rto.Left+j, Rto.Top, Rfrom.Width, Rfrom.Height,
          PNGfrom.Canvas.Handle, Rfrom.Left, Rfrom.Top, SRCCOPY);
      For i:=0 to rfrom.Height-1 do
        CopyMemory(pByte(dword(pngto.AlphaScanline[i+Rto.Top])+Rto.Left+j),
          pByte(dword(pngfrom.AlphaScanline[i+Rfrom.Top])+Rfrom.Left),
            Rfrom.Width);
    end;
  end else
  if (rto.Height>rfrom.Height)and(rto.Width=rfrom.Width) then
  begin
    for j:=0 to rto.Height-rfrom.Height do
    begin
      BitBlt(pngto.Canvas.Handle, Rto.Left, Rto.Top+j, Rfrom.Width, Rfrom.Height,
          PNGfrom.Canvas.Handle, Rfrom.Left, Rfrom.Top, SRCCOPY);
      For i:=0 to rfrom.Height-1 do
        CopyMemory(pByte(dword(pngto.AlphaScanline[i+Rto.Top+j])+Rto.Left),
          pByte(dword(pngfrom.AlphaScanline[i+Rfrom.Top])+Rfrom.Left),
            Rfrom.Width);
    end;
  end else
  if (rto.Height=rfrom.Height)and(rto.Width=rfrom.Width) then
  begin
    BitBlt(pngto.Canvas.Handle, Rto.Left, Rto.Top, Rfrom.Width, Rfrom.Height,
        PNGfrom.Canvas.Handle, Rfrom.Left, Rfrom.Top, SRCCOPY);
    For i:=0 to rfrom.Height-1 do
      CopyMemory(pByte(dword(pngto.AlphaScanline[i+Rto.Top])+Rto.Left),
        pByte(dword(pngfrom.AlphaScanline[i+Rfrom.Top])+Rfrom.Left),
          Rfrom.Width);
  end else begin                                                                //ololo
    for j:=0 to rfrom.width-1 do
      for i:=0 to rfrom.Height-1 do
      begin
        arrbuf[i,j]:=dword(pngfrom.AlphaScanline[i+Rfrom.Top])+Rfrom.Left+j;
      end;
    for j:=0 to rto.width-1 do
      for i:=0 to rto.Height-1 do
      begin
        BitBlt(pngto.Canvas.Handle, Rto.Left+j, Rto.Top+i, 1, 1,
            PNGfrom.Canvas.Handle, Rfrom.Left, Rfrom.Top, SRCCOPY);
        CopyMemory(pByte(dword(pngto.AlphaScanline[i+Rto.Top])+Rto.Left+j),
          pByte(arrbuf[0,0]), 1);
      end;
  end;
End;
Копирует кусок Rfrom из PNGfrom в Rto PNGto, без интерполяции, и неизвестно что делать при Rto<Rfrom. Т.е. подходит для растягивания [1,Y]|[X,1]|[1,1] до [X,Y] png изображений. Для моей изначальной цели пока достаточно. Позже введу интерполяцию.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 17.04.2013, 03:58   #4
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Что-то я на форуме в основном ответами на свои же вопросы занимаюсь) Как в анекдоте: "Нашел на форуме свой вопрос через 2 года, сам ответил"
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исправить программу на C# (с матрицей), чтобы соответствовала заданию. deadp00l Помощь студентам 0 24.12.2012 12:45
Проблема с Canvas.CopyRect Vova777 Общие вопросы Delphi 7 23.05.2012 19:30
как изменить эту программу чтобы она заработала? Анастасия91 Visual C++ 6 13.12.2010 08:05
Canvas.CopyRect DELPHI Что и как... 08ekhiv1 Помощь студентам 1 09.06.2009 08:25
Как сделать программу, чтобы она запускалась везде? grenles Общие вопросы C/C++ 3 11.06.2008 21:10