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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2012, 21:22   #1
casio23
Форумчанин
 
Аватар для casio23
 
Регистрация: 29.12.2010
Сообщений: 186
По умолчанию Создать пустое полноцветное изображение

скажите есть ли функция imagecreatetruecolor для делфи.В Си и PHP она есть. Функция imagecreatetruecolor - Создает пустое полноцветное изображение.
Цитата:
Синтаксис:
resource imagecreatetruecolor (int x_size, int y_size)[/I]
и вот еще одна magecopyresampled

вот код который нужно подстроить под делфи, кто знает синтаксис С помогите решить задачу. Главное 2 функции достать(imagecreatetruecolor, magecopyresampled)

Код:
    private function _getPixelsDiff($Image)
        {
           $Sample = imagecreatetruecolor(8, 8);
           imagecopyresampled($Sample, $Image, 0, 0, 0, 0, 8, 8, imagesx($Image), imagesy($Image));
           
           $Pixels = array();
           $Color = array(0, 0, 0);
           for ($y = 0; $y < 8; $y++)
           {
               for ($x = 0; $x < 8; $x++)
               {
                   $Color1 = imagecolorat($Sample, $x, $y);
                   $Color1 = $this->_scale255To9(array(
                       ($Color1 >> 16) & 0xFF,
                       ($Color1 >> 8) & 0xFF,
                       $Color & 0xFF
                   ));
                   
                   if ($x != 0 || $y != 0)
                   {
                       $Pixels[] = array(
                           $Color1[0] - $Color[0],
                           $Color1[1] - $Color[1],
                           $Color1[2] - $Color[2]
                       );
                   }
     
                    $Color = $Color1;
                }
            }
casio23 вне форума Ответить с цитированием
Старый 14.05.2012, 22:06   #2
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Код:
var
  Btm: TBitmap;
...
Btm := TBitmap.Create;
Btm.width :=X;
Btm.height :=X;
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 14.05.2012, 22:40   #3
casio23
Форумчанин
 
Аватар для casio23
 
Регистрация: 29.12.2010
Сообщений: 186
По умолчанию

а как с этим быть?

Код:
imagecopyresampled($Sample, $Image, 0, 0, 0, 0, 8, 8, imagesx($Image), imagesy($Image));
casio23 вне форума Ответить с цитированием
Старый 14.05.2012, 23:14   #4
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Цитата:
а как с этим быть?

Код:


imagecopyresampled($Sample, $Image, 0, 0, 0, 0, 8, 8, imagesx($Image), imagesy($Image));
функция Bitblt.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 16.05.2012, 13:59   #5
casio23
Форумчанин
 
Аватар для casio23
 
Регистрация: 29.12.2010
Сообщений: 186
По умолчанию

вот что получилось
подскажите с кодом верен он или нет
Цитата:
В конструкторе на каждое изображение вызывается метод _getPixelsDiff(), и его результат кладется в массив Images. Этот метод производит такие манипуляции:
Уменьшает изображение до размеров 8x8.
Создает массив для цветов.
Проходится по каждому пикселю изображения:
Берет его цвет в RGB.
Каждый канал делит на 28.3 и округляет, чтобы максимальное значение канала было равно 9-ти.
Вычитает из каждого канала значение предыдущего пикселя.
Результат кладется в массив и возвращается.

Ну, далее в Compare() вызывается метод _getDiff(), который находит разницу между массивами.
С:
Код:
class ImagesComparer
{
 
    const
        BAD_ARGS = 1,
        UNSUPPORTED_FILETYPE = 2,
        ERROR_OPEN = 3;
 
    public $Images = array();
 
    private
        $_types = array('', 'gif', 'jpeg', 'png', '', '', 'wbmp', '', '', '', '', '');
 
    public $CompareWithFirst = false;
 
    public function __construct($Image1, $Image2 = null)
    {
        if (func_num_args() > 2)
            $Images = func_get_args();
        else if (is_array($Image1))
            $Images = $Image1;
        else
            $Images = array($Image1, $Image2);
 
        foreach ($Images as $Image)
        {
            if (is_string($Image))
                $this->_openImage($Image);
            else if (is_resource($Image))
                $this->Images[] = array($this->_getPixelsDiff($Image), array());
            else
                throw new Exception('Bad arguments.', self::BAD_ARGS);
        }
    }
 
    private function _getImageType($Image)
    {
        $Type = getimagesize($Image);
        if (!$Type = $this->_types[$Type[2]])
            throw new Exception('Image have an unsupported file type.', self::UNSUPPORTED_FILETYPE);
 
        return 'imagecreatefrom' . $Type;
    }
 
    private function _openImage($Image)
    {
        $Type = $this->_getImageType($Image);
        $Image = $Type($Image);
        if (!$Image)
            throw new Exception('Error opening image.', self::ERROR_OPEN);
 
        $this->Images[] = array($this->_getPixelsDiff($Image), array());
        imagedestroy($Image);
    }
 
    private function _getPixelsDiff($Image)
    {
        $Sample = imagecreatetruecolor(8, 8);
        imagecopyresampled($Sample, $Image, 0, 0, 0, 0, 8, 8, imagesx($Image), imagesy($Image));
 
        $Pixels = array();
        $Color = array(0, 0, 0);
        for ($y = 0; $y < 8; $y++)
        {
            for ($x = 0; $x < 8; $x++)
            {
                $Color1 = imagecolorat($Sample, $x, $y);
                $Color1 = $this->_scale255To9(array(
                    ($Color1 >> 16) & 0xFF,
                    ($Color1 >> 8) & 0xFF,
                    $Color & 0xFF
                ));
 
                if ($x != 0 || $y != 0)
                {
                    $Pixels[] = array(
                        $Color1[0] - $Color[0],
                        $Color1[1] - $Color[1],
                        $Color1[2] - $Color[2]
                    );
                }
 
                $Color = $Color1;
            }
        }
        imagedestroy($Sample);
 
        return $Pixels;
    }
 
    private function _scale255To9($NumArr)
    {
        return array(
            round($NumArr[0] / 28.3),
            round($NumArr[1] / 28.3),
            round($NumArr[2] / 28.3)
        );
    }
 
    private function _getDiff($Img1, $Img2)
    {
        $Diff = 0;
        for ($i = 0; $i < 63; $i++)
        {
            $Diff += abs($this->Images[$Img1][0][$i][0] - $this->Images[$Img2][0][$i][0]);
            $Diff += abs($this->Images[$Img1][0][$i][1] - $this->Images[$Img2][0][$i][1]);
            $Diff += abs($this->Images[$Img1][0][$i][2] - $this->Images[$Img2][0][$i][2]);
        }
 
        return $Diff;
    }
 
    public function Compare()
    {
        $count = count($this->Images);
 
        if ($this->CompareWithFirst)
        {
            for ($i = 1; $i < $count; $i++)
            {
                $this->Images[0][1][$i] = $this->_getDiff(0, $i);
            }
        }
        else
        {
            for ($i = 0; $i < $count; $i++)
            {
                for ($k = $i + 1; $k < $count; $k++)
                {
                    //echo "\r\n<br />" .
                    $this->Images[$k][1][$i] =
                        $this->Images[$i][1][$k] = $this->_getDiff($i, $k);
                }
            }
        }
    }
 
}
casio23 вне форума Ответить с цитированием
Старый 16.05.2012, 14:00   #6
casio23
Форумчанин
 
Аватар для casio23
 
Регистрация: 29.12.2010
Сообщений: 186
По умолчанию

Делфи:
Код:
type Color = array [0..2] of integer;
Pixels = array [0..64] of Color;
end;
function _scale255To9(clr:Color):Color;
var clr1:Color;
begin
clr1[0]:=round(clr[0]/28.3);
clr1[1]:=round(clr[1]/28.3);
clr1[2]:=round(clr[2]/28.3);
Return:= clr1;
end;
 
function getImageType(image:TBitmap):Pixels;
var sample:TBitmap;
i,x,y,clr1:integer;
pixels:Pixels;
color,color1:Color;
begin
sample = TBitmap.create();
sample.wtidth := 8;
sample.height := 8;
image.Canvas.copyrect(Bounds(0,0,8,8),image.Canvas,Bounds(0,0,8,8));
i:=0;
for y := 0 to 8 do begin
for x := 0 to 8 do begin
clr1 := sample.Canvas.Pixels[x,y]; 
color1[0] :=(clr1 shr 16) and 255;
color1[1] :=(clr1 shr 8) and 255;
color1[2] := clr1 and 255;
color1 := _scale255To9(color1);
if (x= 0) or (y=0) then begin
color[0] := color1[0] - color[0];
color[1] := color1[1] - color[1];
color[2] := color1[2] - color[2];
pixels[i]: = color;
inc(i);
 
end;
color := color1;
end;
end;
Result:= pixels;
end;
casio23 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать пустое окно с конструктором TwiX Visual C++ 2 18.06.2011 19:01
Пустое окно. 1234123 C++ Builder 20 12.08.2010 17:01
Создать изображение из массива точек levandowskiy C++ Builder 1 21.04.2010 23:32
Как создать анимированное изображение Nikolaj1 Общие вопросы C/C++ 4 25.03.2010 17:12
Графика на Паскале - создать изображение Снеговика HECTOR.A. Помощь студентам 6 23.02.2009 08:52