Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 135

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
скажите есть ли функция imagecreatetruecolor для делфи.В Си и PHP она есть. Функция imagecreatetruecolor - Создает пустое полноцветное изображение.

Синтаксис:
resource imagecreatetruecolor (int x_size, int y_size)

и вот еще одна magecopyresampled

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

Приложение:
  1.  
  2. private function _getPixelsDiff($Image)
  3. {
  4. $Sample = imagecreatetruecolor(8, 8);
  5. imagecopyresampled($Sample, $Image, 0, 0, 0, 0, 8, 8, imagesx($Image), imagesy($Image));
  6.  
  7. $Pixels = array();
  8. $Color = array(0, 0, 0);
  9. for ($y = 0; $y < 8; $y++)
  10. {
  11. for ($x = 0; $x < 8; $x++)
  12. {
  13. $Color1 = imagecolorat($Sample, $x, $y);
  14. $Color1 = $this->_scale255To9(array(
  15. ($Color1 >> 16) & 0xFF,
  16. ($Color1 >> 8) & 0xFF,
  17. $Color & 0xFF
  18. ));
  19.  
  20. if ($x != 0 || $y != 0)
  21. {
  22. $Pixels[] = array(
  23. $Color1[0] - $Color[0],
  24. $Color1[1] - $Color[1],
  25. $Color1[2] - $Color[2]
  26. );
  27. }
  28.  
  29. $Color = $Color1;
  30. }
  31. }


casio Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: casio (статус: Посетитель)
Вопрос отправлен: 14 мая 2012, 21:24
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, casio!
Сказать " в си эта функция есть" - это неверно. Ее нет в Си. Это точно, сколько не ищите. Она есть в библиотеке GD, у которой есть си интерфейс.
смотрим описание resource imagecreatetruecolor (int x_size, int y_size) - она создает просто изображение заданного размера. В делфи для этого нормально использовать TBitmap и код вида

var bmp:TBitmap;
begin
  bmp:=TBitmap.create();
  bmp.wtidth := 8;
  bmp.height := 8;
  // возможно еще нужно будет выставить битность изображения
imagecopyresampled - это обычный copyrect, метод TBitmap
imagecolorat - это просто вызов Pixels[x,y]

Но вот только что бы все это переписать, нужно осмыслить алгоритм кода и потом переписать.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 15 мая 2012, 11:49
Оценка за ответ: 5

Комментарий к оценке: пасиб ))))

Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 18 мая 2012, 23:17; участников в обсуждении: 4.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 14 мая 2012, 22:04 [#1]:

Цитата (casio):

пустое полноцветное изображение

это как? картинку покажите
bugmenot

bugmenot (статус: 3-ий класс), 15 мая 2012, 02:03 [#2]:

Что за глупый вопрос? Если биндинги GD/GD2 для Delphi существуют, по и функция такая есть.
виконання програми розпочинається з того самого мiсця, де призупинилося.

15 мая 2012, 17:05: Статус вопроса изменён на решённый (изменил автор вопроса — casio)

15 мая 2012, 17:06: Вопрос вновь открыт (изменение состояния произвёл автор вопроса — casio)

casio

casio (статус: Посетитель), 16 мая 2012, 13:54 [#3]:

Вадим К: подскажи с кодом, переделал под делфи правильно или нет?

код С:
В конструкторе на каждое изображение вызывается метод _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);
                }
            }
        }
    }
 
}

код Делфи:
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;
Вадим К

Вадим К (статус: Академик), 18 мая 2012, 11:12 [#4]:

Я вижу просто набор функций на разных языках.
Но включив телепатию, которая подсказала, что getImageType в последнем случае и _getPixelsDiff в вопросе одно и тоже и закрыв глаза на ужасное форматирование, я увидел несколько глюков. Например в исходном коде имеем if ($x != 0 || $y != 0) , а в результате if (x= 0) or (y=0).
Подумав немного, понимаем, что второе условие будет срабатывать только в нескольких случаях (когда одна с координат равна 0), хотя в оригинале было иначе ("хотя бы одна с координат не равна нулю").
Галочка "подтверждения прочтения" - вселенское зло.
casio

casio (статус: Посетитель), 18 мая 2012, 13:12 [#5]:

Вадим К: согласен,но я не мастер,как смог так и сделал, не могли б вы помочь отредактировать код?
Вадим К

Вадим К (статус: Академик), 18 мая 2012, 15:02 [#6]:

я думаю, что не нужно быть большим мастером, что бы правильно переписать это условие.
А отредактировать код... В таком виде я не могу редактировать. Это не код, это просто набор функций, при чем на разных языках.
Галочка "подтверждения прочтения" - вселенское зло.
bugmenot

bugmenot (статус: 3-ий класс), 18 мая 2012, 23:17 [#7]:

Отмечу, что похапешный код выглядит лучше паскального.
Надо срочно звонить в Спортлото!
виконання програми розпочинається з того самого мiсця, де призупинилося.

23 мая 2012, 16:54: Статус вопроса изменён на решённый (изменил модератор DNK)

20 июня 2012, 20:57: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Графика (2D и 3D) в приложениях модератором Ерёмин А.А.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:00
Выполнено за 0.04 сек.