Java getSubimage()行为

时间:2017-06-19 19:08:29

标签: java image

好的,所以我进行了一些搜索,无法在任何地方找到这个问题,所以希望它不会重复。

我有这个程序,它应该重新排列图像,使每个角落移动到对角。这是一个例子: The Expected Behavior

这是我尝试过的Java代码:

        //TL
        BufferedImage b1 = (b.getSubimage(0, 0, w/2, h/2));
        //TR
        BufferedImage b2 = (b.getSubimage(w/2, 0, w/2, h/2));
        //BL
        BufferedImage b3 = (b.getSubimage(0, h/2, w/2, h/2));
        //BR
        BufferedImage b4 = (b.getSubimage(w/2, h/2, w/2, h/2));

        Graphics2D g2d = b.createGraphics();

        //New TL
        g2d.drawImage(b4, 0, 0, null);
        //New TR
        g2d.drawImage(b3, w/2, 0, null);
        //New BL
        g2d.drawImage(b2, 0, h/2, null);
        //New BR
        g2d.drawImage(b1, w/2, h/2, null);

其中b是位图,我试图重新排列。此代码生成以下结果:

The Result I'm getting

我设法通过添加额外的行来修复代码:

BufferedImage bTest = new BufferedImage(b.getWidth(), b.getHeight(),BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = bTest.createGraphics();

然后使用bTest而不是b。

所以我想我的问题是,getSubImage实际上做了什么?据我所知,它只是作为对原始BufferedImage的引用而不是在被调用时复制它。

我希望有一个工作版本,它不需要中间BufferedImage。

如果有人可以提供一些帮助,我们将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

假设BufferedImage$ptime = "2017-06-08 03:16:20"; function get_timeago( $ptime ) { $estimate_time = time() - $ptime; if( $estimate_time < 1 ) { return 'less than 1 second ago'; } $condition = array( 12 * 30 * 24 * 60 * 60 => 'year', 30 * 24 * 60 * 60 => 'month', 24 * 60 * 60 => 'day', 60 * 60 => 'hour', 60 => 'minute', 1 => 'second' ); foreach( $condition as $secs => $str ) { $d = $estimate_time / $secs; if( $d >= 1 ) { $r = round( $d ); return ' This Happened About ' . $r . ' ' . $str . ( $r > 1 ? 's' : '' ) . ' ago'; echo "$r"; } } } $timeago=get_timeago(strtotime($ptime)); echo $timeago; - documentation of getSubimage说:

  

返回由指定矩形区域定义的子图像。返回的BufferedImage 与原始图像共享相同的数据数组

这意味着如果你在对面的角落画一个角落,它也会在以前保存的子图像中被绘制

您将需要至少一个临时像素,更好的一个临时角图像。恕我直言最好使用另一个 <?php $sql2="SELECT * FROM ".$cn."msg "; $result2= mysql_query($sql2) or die(mysql_error()); while($rwsm= mysql_fetch_array($result2)){ echo"<li>"; echo "<i class='fa fa-envelope bg-orange'></i>"; echo "<div class='timeline-item'>"; echo "<span class=\"time\"><i class=\"fa fa-clock-o\"></i>".$rwsm[3]."</span>"; echo "<h3 class='timeline-header'><a href='mailto:".$rwsm[2]."'> ".$rwsm[2]." </a></h3>"; $msg= $rwsm[1]; echo "<div class='timeline-body'>".$msg."</div>"; echo "</div>"; echo "</li>"; } ?> (更容易理解)。