|
Вопрос # 6 135/ вопрос решён / |
|
Доброго времени суток, уважаемые эксперты!
скажите есть ли функция imagecreatetruecolor для делфи.В Си и PHP она есть. Функция imagecreatetruecolor - Создает пустое полноцветное изображение.
Синтаксис:
resource imagecreatetruecolor (int x_size, int y_size)
и вот еще одна 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;
- }
- }
 |
Вопрос задал: 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 (статус: 3-ий класс), 15 мая 2012, 02:03 [#2]:
Что за глупый вопрос? Если биндинги GD/GD2 для Delphi существуют, по и функция такая есть.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
15 мая 2012, 17:05: Статус вопроса изменён на решённый (изменил автор вопроса — casio)
15 мая 2012, 17:06: Вопрос вновь открыт (изменение состояния произвёл автор вопроса — 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 (статус: Посетитель), 18 мая 2012, 13:12 [#5]:
Вадим К: согласен,но я не мастер,как смог так и сделал, не могли б вы помочь отредактировать код?
|
|
Вадим К (статус: Академик), 18 мая 2012, 15:02 [#6]:
я думаю, что не нужно быть большим мастером, что бы правильно переписать это условие.
А отредактировать код... В таком виде я не могу редактировать. Это не код, это просто набор функций, при чем на разных языках.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
bugmenot (статус: 3-ий класс), 18 мая 2012, 23:17 [#7]:
Отмечу, что похапешный код выглядит лучше паскального.
Надо срочно звонить в Спортлото!
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
23 мая 2012, 16:54: Статус вопроса изменён на решённый (изменил модератор DNK)
20 июня 2012, 20:57: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Графика (2D и 3D) в приложениях модератором Ерёмин А.А.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|