Во-первых, вы пропустили часть данных при записи файла. После ширины и высоты вам нужно добавить максимальное значение, которое может принять канал. Таким образом, ваш файл должен выглядеть примерно так:
P2
300 200
255
<...image data...>
Далее вы передаете ширину и высоту прямоугольника в drawRect
, но он обрабатывает их так, как если бы они были справа и снизу от прямоугольника. , Когда вы передаете 25 и 50 для высоты и ширины, левый и верхний уже больше, чем, поэтому внешний цикл даже не выполняется ни разу. Вам нужно сделать свой цикл в drawRect
следующим образом:
for (int rectRow = rectTop; rectRow < rectTop + rectHeight; rectRow++)
{
for (int rectCol = rectLeft; rectCol < rectLeft + rectWidth; rectCol++)
image[rectRow][rectCol] = { grayLevel };
}
Это могло бы справка (вероятно, лучше всего использовать jQuery, onDomReady и незаметно добавить keydown событие к текстовой области), но протестированное в IE7 и FF3:
<html>
<head><title>Test</title></head>
<body>
<script type="text/javascript">
var keynum, lines = 1;
function limitLines(obj, e) {
// IE
if(window.event) {
keynum = e.keyCode;
// Netscape/Firefox/Opera
} else if(e.which) {
keynum = e.which;
}
if(keynum == 13) {
if(lines == obj.rows) {
return false;
}else{
lines++;
}
}
}
</script>
<textarea rows="4" onkeydown="return limitLines(this, event)"></textarea>
</body>
</html>
*Edit - объяснение: Это ловит нажатие клавиши, если клавиша ENTER нажимается и просто не добавляет новую строку, если строки в текстовой области являются тем же числом как строки текстовой области. Еще это увеличивает количество строк.
Редактирование № 2: люди Рассмотрения все еще приходят к этому ответу, я думал, что обновлю его, чтобы обработать вставку, удалить и сократить, настолько лучше всего, как я могу.
<html>
<head>
<title>Test</title>
<style>
.limit-me {
height: 500px;
width: 500px;
}
</style>
</head>
<body>
<textarea rows="4" class="limit-me"></textarea>
<script>
var lines = 1;
function getKeyNum(e) {
var keynum;
// IE
if (window.event) {
keynum = e.keyCode;
// Netscape/Firefox/Opera
} else if (e.which) {
keynum = e.which;
}
return keynum;
}
var limitLines = function (e) {
var keynum = getKeyNum(e);
if (keynum === 13) {
if (lines >= this.rows) {
e.stopPropagation();
e.preventDefault();
} else {
lines++;
}
}
};
var setNumberOfLines = function (e) {
lines = getNumberOfLines(this.value);
};
var limitPaste = function (e) {
var clipboardData, pastedData;
// Stop data actually being pasted into div
e.stopPropagation();
e.preventDefault();
// Get pasted data via clipboard API
clipboardData = e.clipboardData || window.clipboardData;
pastedData = clipboardData.getData('Text');
var pastedLines = getNumberOfLines(pastedData);
// Do whatever with pasteddata
if (pastedLines <= this.rows) {
lines = pastedLines;
this.value = pastedData;
}
else if (pastedLines > this.rows) {
// alert("Too many lines pasted ");
this.value = pastedData
.split(/\r\n|\r|\n/)
.slice(0, this.rows)
.join("\n ");
}
};
function getNumberOfLines(str) {
if (str) {
return str.split(/\r\n|\r|\n/).length;
}
return 1;
}
var limitedElements = document.getElementsByClassName('limit-me');
Array.from(limitedElements).forEach(function (element) {
element.addEventListener('keydown', limitLines);
element.addEventListener('keyup', setNumberOfLines);
element.addEventListener('cut', setNumberOfLines);
element.addEventListener('paste', limitPaste);
});
</script>
</body>
</html>
Количество видимых / строк дисплея для данного блока текста менялось бы в зависимости от различных браузеров, используемые шрифты, и т.д. Необходимо было бы установить определенный шрифт и размер шрифта, как минимум, чтобы смочь полунадежно считать строки дисплея.
ОБНОВЛЕНИЕ: Я вижу редактирование. Затем что-то как код kevchadders должно сделать прекрасный для Вас. Вам будет нужен js, который считает символы и '\r\n и проверки по сравнению с пользовательским пределом. Кроме того, если Вы не используете его сценарий, удостоверьтесь, что Вы используете тот, который вовлекает любого проверка временного интервала и/или onKeyDown/onKeyUp события текстовой области. Это может быть то, почему некоторые сценарии, которые Вы протестировали, кажется, "ведут себя странно".
Это - в основном то же как ответ Ivan, с помощью jQuery. Я протестировал его на мой собственный проект; кажется, хорошо работает.
<script type="text/javascript" charset="utf-8">
$(function()
{
function getLines(id)
{
return $('#' + id).val().split("\n").length
}
$('#testing').keyup(function()
{
var allowedNumberOfLines = 4;
if(getLines('testing') > allowedNumberOfLines)
{
modifiedText = $(this).val().split("\n").slice(0, allowedNumberOfLines);
$(this).val(modifiedText.join("\n"));
}
});
});
</script>